diff --git a/TUnit.Mocks.Assertions/MockAssertionExtensions.cs b/TUnit.Mocks.Assertions/MockAssertionExtensions.cs index 98dd817347..a9214990aa 100644 --- a/TUnit.Mocks.Assertions/MockAssertionExtensions.cs +++ b/TUnit.Mocks.Assertions/MockAssertionExtensions.cs @@ -1,5 +1,7 @@ using System.Runtime.CompilerServices; +using TUnit.Assertions.Attributes; using TUnit.Assertions.Core; +using TUnit.Mocks.Exceptions; using TUnit.Mocks.Verification; namespace TUnit.Mocks.Assertions; @@ -10,6 +12,29 @@ namespace TUnit.Mocks.Assertions; /// public static class MockAssertionExtensions { + /// + /// Asserts that the mock member was called at least once. + /// Generates the WasCalled() assertion on . + /// + [GenerateAssertion(ExpectationMessage = "to have been called")] + public static AssertionResult WasCalled(ICallVerification verification) + { + if (verification is null) + { + return AssertionResult.Failed("Verification target is null"); + } + + try + { + verification.WasCalled(); + return AssertionResult.Passed; + } + catch (MockVerificationException ex) + { + return AssertionResult.Failed(ex.Message); + } + } + /// /// Asserts that the mock member was called the specified number of times. /// diff --git a/TUnit.Mocks.Assertions/TUnit.Mocks.Assertions.csproj b/TUnit.Mocks.Assertions/TUnit.Mocks.Assertions.csproj index ec69d4e884..e0deaada1f 100644 --- a/TUnit.Mocks.Assertions/TUnit.Mocks.Assertions.csproj +++ b/TUnit.Mocks.Assertions/TUnit.Mocks.Assertions.csproj @@ -9,6 +9,7 @@ + diff --git a/TUnit.Mocks.Tests/AsyncVerificationTests.cs b/TUnit.Mocks.Tests/AsyncVerificationTests.cs index 055094109f..af4b6974d0 100644 --- a/TUnit.Mocks.Tests/AsyncVerificationTests.cs +++ b/TUnit.Mocks.Tests/AsyncVerificationTests.cs @@ -84,6 +84,30 @@ await Assert.That(mock.Add(Any(), Any())) .WasCalled(Times.AtLeastOnce); } + [Test] + public async Task WasCalled_AtLeastOnceByDefault_Passes() + { + var mock = ICalculator.Mock(); + mock.Add(Any(), Any()).Returns(42); + + ICalculator calc = mock.Object; + _ = calc.Add(1, 2); + _ = calc.Add(3, 4); + + await Assert.That(mock.Add(Any(), Any())) + .WasCalled(); + } + + [Test] + public async Task WasCalled_Default_Fails_When_Not_Called() + { + var mock = ICalculator.Mock(); + + await Assert.ThrowsAsync(async () => + await Assert.That(mock.Add(Any(), Any())) + .WasCalled()); + } + [Test] public async Task Property_Getter_WasCalled_Via_Assert() {