Skip to content

feat: expose hidden base-interface members via Mock.As<TBase>()#802

Merged
vbreuss merged 1 commit into
mainfrom
feat/setup-verify-base-interface-members
Jun 20, 2026
Merged

feat: expose hidden base-interface members via Mock.As<TBase>()#802
vbreuss merged 1 commit into
mainfrom
feat/setup-verify-base-interface-members

Conversation

@vbreuss

@vbreuss vbreuss commented Jun 20, 2026

Copy link
Copy Markdown
Member

When a derived interface hides a base member with new, the hidden base slot was unreachable from the setup/verify surface. The mock now also implements the base interface's IMockSetupFor.../IMockVerifyFor... surfaces, so IDerived.CreateMock().Mock.As() can configure and verify the hidden slot without an explicit Implementing<>() call.

Methods, properties and events get separate base/derived slots; indexers share storage by parameter signature. Bases with static members are out of scope.

When a derived interface hides a base member with `new`, the hidden base slot was unreachable from the setup/verify surface. The mock now also implements the base interface's IMockSetupFor.../IMockVerifyFor... surfaces, so IDerived.CreateMock().Mock.As<IBase>() can configure and verify the hidden slot without an explicit Implementing<>() call.

Methods, properties and events get separate base/derived slots; indexers share storage by parameter signature. Bases with static members are out of scope.
@vbreuss vbreuss self-assigned this Jun 20, 2026
@vbreuss vbreuss added the enhancement New feature or request label Jun 20, 2026
@vbreuss vbreuss enabled auto-merge (squash) June 20, 2026 12:32
@sonarqubecloud

sonarqubecloud Bot commented Jun 20, 2026

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

Test Results

    24 files  ± 0      24 suites  ±0   8m 50s ⏱️ - 1m 18s
 4 154 tests + 4   4 152 ✅ + 4  2 💤 ±0  0 ❌ ±0 
26 726 runs  +28  26 722 ✅ +28  4 💤 ±0  0 ❌ ±0 

Results for commit 88c81db. ± Comparison against base commit a751598.

@vbreuss vbreuss merged commit 4c019e4 into main Jun 20, 2026
17 checks passed
@vbreuss vbreuss deleted the feat/setup-verify-base-interface-members branch June 20, 2026 12:40
@github-actions

Copy link
Copy Markdown

🚀 Benchmark Results

Details

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 2.60GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.301
[Host] : .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3

Job=InProcess Toolchain=InProcessEmitToolchain IterationCount=15
LaunchCount=1 WarmupCount=10

Callback Mean Error StdDev Ratio Allocated Alloc Ratio
baseline* 327.5 ns 4.83 ns 4.28 ns 1.03 1.68 KB 1.00
Mockolate 317.2 ns 3.02 ns 2.82 ns 1.00 1.68 KB 1.00
Imposter 390.1 ns 1.07 ns 0.95 ns 1.23 2.38 KB 1.42
TUnitMocks 516.0 ns 2.85 ns 2.66 ns 1.63 1.99 KB 1.19
Moq 72,377.2 ns 424.98 ns 376.74 ns 228.18 8.88 KB 5.29
NSubstitute 4,053.5 ns 12.59 ns 10.52 ns 12.78 7.74 KB 4.61
FakeItEasy 4,196.4 ns 15.83 ns 14.81 ns 13.23 6.81 KB 4.05
Details

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.301
[Host] : .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3

Job=InProcess Toolchain=InProcessEmitToolchain IterationCount=15
LaunchCount=1 WarmupCount=10

Indexer N Mean Error StdDev Ratio Allocated Alloc Ratio
baseline* 1 1,077.0 ns 28.18 ns 26.36 ns 1.09 3.82 KB 1.00
Mockolate 1 983.8 ns 39.09 ns 36.56 ns 1.00 3.82 KB 1.00
Imposter 1 963.9 ns 33.52 ns 29.71 ns 0.98 5.16 KB 1.35
Moq 1 217,615.8 ns 938.80 ns 832.22 ns 221.49 20.32 KB 5.32
NSubstitute 1 9,235.8 ns 82.41 ns 73.06 ns 9.40 12.78 KB 3.35
FakeItEasy 1 12,366.2 ns 72.41 ns 67.74 ns 12.59 13.63 KB 3.57
baseline* 10 2,575.0 ns 13.79 ns 11.51 ns 1.03 4.88 KB 1.00
Mockolate 10 2,509.7 ns 23.29 ns 21.79 ns 1.00 4.88 KB 1.00
Imposter 10 2,189.5 ns 36.07 ns 33.74 ns 0.87 7.97 KB 1.63
Moq 10 228,496.8 ns 996.59 ns 883.45 ns 91.05 28.72 KB 5.89
NSubstitute 10 22,587.4 ns 162.72 ns 144.25 ns 9.00 25.58 KB 5.25
FakeItEasy 10 25,117.3 ns 160.76 ns 142.51 ns 10.01 32.97 KB 6.76
Details

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 2.87GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.301
[Host] : .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3

Job=InProcess Toolchain=InProcessEmitToolchain IterationCount=15
LaunchCount=1 WarmupCount=10

Property N Mean Error StdDev Ratio Allocated Alloc Ratio
baseline* 1 518.8 ns 26.54 ns 24.82 ns 0.89 2.47 KB 1.00
Mockolate 1 584.7 ns 10.40 ns 9.73 ns 1.00 2.47 KB 1.00
Imposter 1 434.8 ns 6.52 ns 5.78 ns 0.74 3.13 KB 1.27
TUnitMocks 1 490.7 ns 4.71 ns 3.93 ns 0.84 1.64 KB 0.66
Moq 1 10,774.1 ns 125.09 ns 117.01 ns 18.43 10.39 KB 4.21
NSubstitute 1 6,919.0 ns 61.51 ns 57.53 ns 11.84 11.45 KB 4.64
FakeItEasy 1 7,472.7 ns 155.87 ns 145.80 ns 12.78 11.24 KB 4.55
baseline* 10 993.3 ns 5.87 ns 5.21 ns 0.88 2.96 KB 1.00
Mockolate 10 1,134.5 ns 37.37 ns 34.95 ns 1.00 2.96 KB 1.00
Imposter 10 1,084.0 ns 7.01 ns 6.55 ns 0.96 4.67 KB 1.58
TUnitMocks 10 1,650.7 ns 18.02 ns 16.86 ns 1.46 3.94 KB 1.33
Moq 10 17,135.1 ns 229.92 ns 203.81 ns 15.12 18.28 KB 6.17
NSubstitute 10 15,682.9 ns 290.86 ns 272.07 ns 13.84 21.08 KB 7.12
FakeItEasy 10 18,091.3 ns 434.31 ns 406.25 ns 15.96 30.81 KB 10.40
Details

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 2.81GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.301
[Host] : .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3

Job=InProcess Toolchain=InProcessEmitToolchain IterationCount=15
LaunchCount=1 WarmupCount=10

Event Mean Error StdDev Ratio Allocated Alloc Ratio
baseline* 332.2 ns 12.33 ns 11.54 ns 1.03 1.78 KB 1.00
Mockolate 323.9 ns 5.40 ns 5.05 ns 1.00 1.78 KB 1.00
Imposter 1,313.5 ns 21.01 ns 19.65 ns 4.06 8.8 KB 4.94
TUnitMocks 174.1 ns 3.79 ns 3.54 ns 0.54 1.34 KB 0.75
Moq 14,510.8 ns 172.91 ns 153.28 ns 44.81 12.51 KB 7.02
NSubstitute 5,343.3 ns 171.30 ns 160.24 ns 16.50 9.05 KB 5.08
FakeItEasy 231,537.2 ns 1,787.08 ns 1,584.20 ns 714.95 15.26 KB 8.57
Details

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Intel Xeon Platinum 8370C CPU 2.80GHz (Max: 3.39GHz), 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.301
[Host] : .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4

Job=InProcess Toolchain=InProcessEmitToolchain IterationCount=15
LaunchCount=1 WarmupCount=10

Method N Mean Error StdDev Ratio Allocated Alloc Ratio
baseline* 1 430.3 ns 11.21 ns 10.49 ns 1.01 2.04 KB 1.00
Mockolate 1 425.4 ns 8.21 ns 7.28 ns 1.00 2.04 KB 1.00
Imposter 1 629.2 ns 14.32 ns 13.39 ns 1.48 4.04 KB 1.98
TUnitMocks 1 585.4 ns 6.91 ns 6.46 ns 1.38 2.02 KB 0.99
Moq 1 137,163.3 ns 386.77 ns 342.86 ns 322.54 14.59 KB 7.15
NSubstitute 1 6,265.2 ns 28.94 ns 27.07 ns 14.73 9.12 KB 4.47
FakeItEasy 1 5,986.1 ns 47.13 ns 44.08 ns 14.08 8.06 KB 3.95
baseline* 10 700.5 ns 15.38 ns 14.39 ns 0.82 2.25 KB 1.00
Mockolate 10 859.4 ns 5.52 ns 5.16 ns 1.00 2.25 KB 1.00
Imposter 10 1,276.9 ns 25.44 ns 23.80 ns 1.49 5.52 KB 2.45
TUnitMocks 10 1,774.0 ns 10.18 ns 9.52 ns 2.06 3.73 KB 1.66
Moq 10 143,111.3 ns 739.58 ns 691.80 ns 166.54 18.49 KB 8.22
NSubstitute 10 9,311.0 ns 31.38 ns 27.82 ns 10.84 12.07 KB 5.36
FakeItEasy 10 9,595.0 ns 60.05 ns 53.23 ns 11.17 15.42 KB 6.85
Details

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.301
[Host] : .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3

Job=InProcess Toolchain=InProcessEmitToolchain IterationCount=15
LaunchCount=1 WarmupCount=10

CreateMock Mean Error StdDev Ratio Allocated Alloc Ratio
baseline* 66.19 ns 0.972 ns 0.909 ns 0.96 440 B 1.00
Mockolate 68.66 ns 2.735 ns 2.558 ns 1.00 440 B 1.00
Imposter 268.14 ns 7.489 ns 7.005 ns 3.91 2248 B 5.11
TUnitMocks 35.97 ns 1.607 ns 1.503 ns 0.52 200 B 0.45
Moq 1,461.30 ns 18.768 ns 17.555 ns 21.31 2096 B 4.76
NSubstitute 2,046.24 ns 30.723 ns 27.235 ns 29.84 5048 B 11.47
FakeItEasy 1,803.88 ns 58.948 ns 55.140 ns 26.31 2763 B 6.28

baseline* rows show the corresponding Mockolate benchmark from the most recent successful main branch build with results, for regression comparison.

github-actions Bot added a commit that referenced this pull request Jun 20, 2026
…ers via Mock.As<TBase>() (#802) by Valentin Breuß
github-actions Bot added a commit that referenced this pull request Jun 20, 2026
…ers via Mock.As<TBase>() (#802) by Valentin Breuß
@github-actions

Copy link
Copy Markdown

This is addressed in release v3.3.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request state: released The issue is released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant