Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
d02862f
feat(mocks): add MockMethodCall<TReturn> and VoidMockMethodCall unifi…
thomhurst Feb 23, 2026
88d5d29
feat(mocks): add PropertyMockCall<TProperty> and PropertySetterMockCa…
thomhurst Feb 23, 2026
9e29594
feat(mocks): simplify Mock<T> by removing Setup/Verify/Raise surfaces
thomhurst Feb 23, 2026
4ac0258
feat(mocks): replace MockSetupBuilder + MockVerifyBuilder with unifie…
thomhurst Feb 23, 2026
05814e9
refactor: update RaiseBuilder and factory builders for simplified Moc…
thomhurst Feb 23, 2026
d0a70f0
refactor(mocks): update all test files for unified Mock<T> API
thomhurst Feb 23, 2026
ff689f0
fix(mocks): eagerly register void method and property setter setups
thomhurst Feb 23, 2026
c41427e
docs: update mocking documentation for unified Mock<T> API
thomhurst Feb 23, 2026
f225a2c
fix(mocks): use Lazy<T> for thread-safe setup registration in non-voi…
thomhurst Feb 23, 2026
f5f06f4
fix(mocks): address review feedback — member names, setter registrati…
thomhurst Feb 23, 2026
78c57a3
fix(mocks): use Lazy<T> in PropertySetterMockCall for consistency
thomhurst Feb 23, 2026
c6690cc
fix(mocks): cache matchers/name in PropertySetterMockCall, clarify ge…
thomhurst Feb 23, 2026
7db470f
feat(mocks): generate strongly-typed SetsOut/SetsRef methods for out/…
thomhurst Feb 23, 2026
9346b08
fix(mocks): address review feedback — attribute ordering, modern syntax
thomhurst Feb 23, 2026
f7495b3
fix(mocks): eliminate PropertySetterMockCall duplication, consolidate…
thomhurst Feb 23, 2026
42b8448
fix(mocks): document eager registration rationale on PropertySetterMo…
thomhurst Feb 23, 2026
b603826
fix(mocks): use Lazy<T> in generated void wrapper classes for thread …
thomhurst Feb 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactor(mocks): update all test files for unified Mock<T> API
Remove .Setup., .Verify., and .Raise. accessor patterns from all 43
test files in TUnit.Mocks.Tests/ to match the new unified API where
mock members are accessed directly on Mock<T>. Also update InState
lambda parameters from 'setup' to 'm'.
  • Loading branch information
thomhurst committed Feb 23, 2026
commit d0a70f097721c62a1c259d60d4f4371588fe7467
24 changes: 12 additions & 12 deletions TUnit.Mocks.Tests/AdditionalCoverageTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public async Task Exception_Properties_Populated_On_Verification_Failure()
// Act — verify wrong count
var ex = Assert.Throws<MockVerificationException>(() =>
{
mock.Verify.Add(1, 2).WasCalled(Times.Exactly(5));
mock.Add(1, 2).WasCalled(Times.Exactly(5));
});

// Assert — all properties accessible
Expand All @@ -43,7 +43,7 @@ public async Task Exception_Message_Contains_Custom_Message()
// Act — verify with custom message
var ex = Assert.Throws<MockVerificationException>(() =>
{
mock.Verify.Add(1, 2).WasCalled(Times.Once, "Calculator Add was expected");
mock.Add(1, 2).WasCalled(Times.Once, "Calculator Add was expected");
});

await Assert.That(ex.Message).Contains("Calculator Add was expected");
Expand All @@ -62,7 +62,7 @@ public async Task Exception_ActualCalls_Lists_All_Calls_To_Member()
// Act — verify wrong specific args
var ex = Assert.Throws<MockVerificationException>(() =>
{
mock.Verify.Add(99, 99).WasCalled(Times.Once);
mock.Add(99, 99).WasCalled(Times.Once);
});

// Assert — all 3 actual calls to Add are listed
Expand Down Expand Up @@ -146,7 +146,7 @@ public class MockObjectAccessTests
public async Task Object_Property_Returns_Mock_Implementation()
{
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(1, 2).Returns(3);
mock.Add(1, 2).Returns(3);

var calc = mock.Object;
var result = calc.Add(1, 2);
Expand Down Expand Up @@ -207,7 +207,7 @@ public async Task VerifyAll_Message_Includes_Matcher_Descriptions()
{
// Arrange
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(Arg.Any<int>(), Arg.Is<int>(x => x > 0)).Returns(1);
mock.Add(Arg.Any<int>(), Arg.Is<int>(x => x > 0)).Returns(1);

// Act — don't call the method

Expand All @@ -222,9 +222,9 @@ public async Task VerifyAll_Message_Lists_Multiple_Uninvoked_Setups()
{
// Arrange
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(1, 2).Returns(3);
mock.Setup.GetName().Returns("name");
mock.Setup.Log("msg");
mock.Add(1, 2).Returns(3);
mock.GetName().Returns("name");
mock.Log("msg");

// Act — don't call any methods

Expand All @@ -240,8 +240,8 @@ public async Task VerifyAll_Passes_When_All_Setups_Invoked()
{
// Arrange
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(1);
mock.Setup.GetName().Returns("name");
mock.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(1);
mock.GetName().Returns("name");

// Act — invoke all setups
mock.Object.Add(1, 2);
Expand Down Expand Up @@ -336,7 +336,7 @@ public async Task WasNeverCalled_With_Custom_Message()

var ex = Assert.Throws<MockVerificationException>(() =>
{
mock.Verify.Add(1, 2).WasNeverCalled("Add should not have been called");
mock.Add(1, 2).WasNeverCalled("Add should not have been called");
});

await Assert.That(ex.Message).Contains("Add should not have been called");
Expand All @@ -350,7 +350,7 @@ public async Task WasCalled_No_Args_With_Custom_Message()

var ex = Assert.Throws<MockVerificationException>(() =>
{
mock.Verify.Add(1, 2).WasCalled("Expected Add to be called");
mock.Add(1, 2).WasCalled("Expected Add to be called");
});

await Assert.That(ex.Message).Contains("Expected Add to be called");
Expand Down
28 changes: 14 additions & 14 deletions TUnit.Mocks.Tests/ArgumentMatcherTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public async Task Arg_Any_Matches_All_Values()
{
// Arrange
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(42);
mock.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(42);

// Act
ICalculator calc = mock.Object;
Expand All @@ -30,7 +30,7 @@ public async Task Arg_Is_With_Predicate_Matches_When_True()
{
// Arrange
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(Arg.Is<int>(a => a > 0), Arg.Is<int>(b => b > 0)).Returns(100);
mock.Add(Arg.Is<int>(a => a > 0), Arg.Is<int>(b => b > 0)).Returns(100);

// Act
ICalculator calc = mock.Object;
Expand All @@ -50,7 +50,7 @@ public async Task Arg_Is_With_Exact_Value()
{
// Arrange
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(Arg.Is(10), Arg.Is(20)).Returns(30);
mock.Add(Arg.Is(10), Arg.Is(20)).Returns(30);

// Act
ICalculator calc = mock.Object;
Expand All @@ -69,7 +69,7 @@ public async Task Arg_Capture_Captures_Values()
// Arrange
var firstArg = Arg.Any<int>();
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(firstArg, Arg.Any<int>()).Returns(1);
mock.Add(firstArg, Arg.Any<int>()).Returns(1);

// Act
ICalculator calc = mock.Object;
Expand All @@ -91,7 +91,7 @@ public async Task Mixed_Matchers_And_Exact_Values()
// Arrange
var mock = Mock.Of<ICalculator>();
// First arg: any int. Second arg: exact 5.
mock.Setup.Add(Arg.Any<int>(), 5).Returns(99);
mock.Add(Arg.Any<int>(), 5).Returns(99);

// Act
ICalculator calc = mock.Object;
Expand All @@ -111,7 +111,7 @@ public async Task Arg_IsNull_Matches_Null_Values()
{
// Arrange
var mock = Mock.Of<IGreeter>();
mock.Setup.Greet(Arg.IsNull<string>()).Returns("got null");
mock.Greet(Arg.IsNull<string>()).Returns("got null");

// Act
IGreeter greeter = mock.Object;
Expand All @@ -128,7 +128,7 @@ public async Task Arg_IsNotNull_Matches_NonNull_Values()
{
// Arrange
var mock = Mock.Of<IGreeter>();
mock.Setup.Greet(Arg.IsNotNull<string>()).Returns("got something");
mock.Greet(Arg.IsNotNull<string>()).Returns("got something");

// Act
IGreeter greeter = mock.Object;
Expand All @@ -148,7 +148,7 @@ public async Task Arg_Capture_With_String_Values()
// Arrange
var nameArg = Arg.Any<string>();
var mock = Mock.Of<IGreeter>();
mock.Setup.Greet(nameArg).Returns("hi");
mock.Greet(nameArg).Returns("hi");

// Act
IGreeter greeter = mock.Object;
Expand All @@ -167,8 +167,8 @@ public async Task Multiple_Setups_With_Different_Matchers()
{
// Arrange — more specific setup first, then broader
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(1, 1).Returns(100);
mock.Setup.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(42);
mock.Add(1, 1).Returns(100);
mock.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(42);

// Act
ICalculator calc = mock.Object;
Expand All @@ -183,8 +183,8 @@ public async Task Specific_Setup_After_Any_Takes_Precedence()
{
// Arrange — broad setup first, then specific
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(42);
mock.Setup.Add(1, 1).Returns(100);
mock.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(42);
mock.Add(1, 1).Returns(100);

// Act
ICalculator calc = mock.Object;
Expand All @@ -211,7 +211,7 @@ public async Task Arg_Capture_Does_Not_Capture_On_Partial_Match()
// Arrange — setup requires first arg = any (captured), second arg starts with "prefix"
var firstArg = Arg.Any<int>();
var mock = Mock.Of<ICalculator>();
mock.Setup.Add(firstArg, Arg.Is<int>(b => b > 100)).Returns(999);
mock.Add(firstArg, Arg.Is<int>(b => b > 100)).Returns(999);

ICalculator calc = mock.Object;

Expand All @@ -235,7 +235,7 @@ public async Task Predicate_Matcher_With_String()
{
// Arrange
var mock = Mock.Of<IGreeter>();
mock.Setup.Greet(Arg.Is<string>(s => s != null && s.StartsWith("A"))).Returns("starts with A");
mock.Greet(Arg.Is<string>(s => s != null && s.StartsWith("A"))).Returns("starts with A");

// Act
IGreeter greeter = mock.Object;
Expand Down
18 changes: 9 additions & 9 deletions TUnit.Mocks.Tests/AsyncTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public async Task Task_Int_Returns_Unwrapped_Value()
{
// Arrange
var mock = Mock.Of<IAsyncService>();
mock.Setup.GetValueAsync().Returns(5);
mock.GetValueAsync().Returns(5);

IAsyncService service = mock.Object;

Expand All @@ -42,7 +42,7 @@ public async Task Task_String_Returns_Unwrapped_Value()
{
// Arrange
var mock = Mock.Of<IAsyncService>();
mock.Setup.GetNameAsync(Arg.Any<string>()).Returns("hello");
mock.GetNameAsync(Arg.Any<string>()).Returns("hello");

IAsyncService service = mock.Object;

Expand All @@ -58,8 +58,8 @@ public async Task Task_String_With_Exact_Arg_Match()
{
// Arrange
var mock = Mock.Of<IAsyncService>();
mock.Setup.GetNameAsync("key1").Returns("value1");
mock.Setup.GetNameAsync("key2").Returns("value2");
mock.GetNameAsync("key1").Returns("value1");
mock.GetNameAsync("key2").Returns("value2");

IAsyncService service = mock.Object;

Expand Down Expand Up @@ -88,7 +88,7 @@ public async Task ValueTask_Int_Returns_Unwrapped_Value()
{
// Arrange
var mock = Mock.Of<IAsyncService>();
mock.Setup.GetValueValueTaskAsync().Returns(42);
mock.GetValueValueTaskAsync().Returns(42);

IAsyncService service = mock.Object;

Expand All @@ -104,7 +104,7 @@ public async Task Async_Method_Throws_Returns_Faulted_Task()
{
// Arrange
var mock = Mock.Of<IAsyncService>();
mock.Setup.GetValueAsync().Throws<InvalidOperationException>();
mock.GetValueAsync().Throws<InvalidOperationException>();

IAsyncService service = mock.Object;

Expand Down Expand Up @@ -162,7 +162,7 @@ public async Task Async_Method_Sequential_Returns()
{
// Arrange
var mock = Mock.Of<IAsyncService>();
mock.Setup.GetValueAsync().ReturnsSequentially(10, 20, 30);
mock.GetValueAsync().ReturnsSequentially(10, 20, 30);

IAsyncService service = mock.Object;

Expand All @@ -179,7 +179,7 @@ public async Task Async_Method_Verify_Called()
{
// Arrange
var mock = Mock.Of<IAsyncService>();
mock.Setup.GetValueAsync().Returns(5);
mock.GetValueAsync().Returns(5);

IAsyncService service = mock.Object;

Expand All @@ -188,7 +188,7 @@ public async Task Async_Method_Verify_Called()
await service.GetValueAsync();

// Assert — verify it was called twice
mock.Verify.GetValueAsync().WasCalled(Times.Exactly(2));
mock.GetValueAsync().WasCalled(Times.Exactly(2));
await Assert.That(true).IsTrue();
}
}
Loading