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()
{