diff --git a/TUnit.Mocks.Benchmarks/CallbackBenchmarks.cs b/TUnit.Mocks.Benchmarks/CallbackBenchmarks.cs index 5e1443f93e..b65d751d6f 100644 --- a/TUnit.Mocks.Benchmarks/CallbackBenchmarks.cs +++ b/TUnit.Mocks.Benchmarks/CallbackBenchmarks.cs @@ -17,7 +17,7 @@ public class CallbackBenchmarks public int TUnitMocks_Callback() { var count = 0; - var mock = Mock.Of(); + var mock = INotificationService.Mock(); mock.Send(TUnitArg.Any(), TUnitArg.Any()) .Callback(() => count++); @@ -98,7 +98,7 @@ public int FakeItEasy_Callback() public string TUnitMocks_CallbackWithArgs() { var lastMessage = ""; - var mock = Mock.Of(); + var mock = ILogger.Mock(); mock.Log(TUnitArg.Any(), TUnitArg.Any()) .Callback((string _, string msg) => lastMessage = msg); diff --git a/TUnit.Mocks.Benchmarks/CombinedWorkflowBenchmarks.cs b/TUnit.Mocks.Benchmarks/CombinedWorkflowBenchmarks.cs index 362b9476fb..47c752a849 100644 --- a/TUnit.Mocks.Benchmarks/CombinedWorkflowBenchmarks.cs +++ b/TUnit.Mocks.Benchmarks/CombinedWorkflowBenchmarks.cs @@ -21,8 +21,8 @@ public class CombinedWorkflowBenchmarks public void TUnitMocks_FullWorkflow() { // Create - var repoMock = Mock.Of(); - var loggerMock = Mock.Of(); + var repoMock = IUserRepository.Mock(); + var loggerMock = ILogger.Mock(); // Setup repoMock.GetById(1).Returns(new User { Id = 1, Name = "Alice", Email = "alice@test.com" }); diff --git a/TUnit.Mocks.Benchmarks/InvocationBenchmarks.cs b/TUnit.Mocks.Benchmarks/InvocationBenchmarks.cs index eec35caff4..aaf0f46565 100644 --- a/TUnit.Mocks.Benchmarks/InvocationBenchmarks.cs +++ b/TUnit.Mocks.Benchmarks/InvocationBenchmarks.cs @@ -27,7 +27,7 @@ public class InvocationBenchmarks public void Setup() { // TUnit.Mocks - _tunitMock = Mock.Of(); + _tunitMock = ICalculatorService.Mock(); _tunitMock.Add(TUnitArg.Any(), TUnitArg.Any()).Returns(42); _tunitMock.Format(TUnitArg.Any()).Returns("formatted"); _tunitObject = _tunitMock.Object; diff --git a/TUnit.Mocks.Benchmarks/MockCreationBenchmarks.cs b/TUnit.Mocks.Benchmarks/MockCreationBenchmarks.cs index aa4d981882..a39bea9709 100644 --- a/TUnit.Mocks.Benchmarks/MockCreationBenchmarks.cs +++ b/TUnit.Mocks.Benchmarks/MockCreationBenchmarks.cs @@ -16,7 +16,7 @@ public class MockCreationBenchmarks [Benchmark(Description = "TUnit.Mocks")] public object TUnitMocks_CreateMock() { - var mock = Mock.Of(); + var mock = ICalculatorService.Mock(); return mock.Object; } @@ -58,7 +58,7 @@ public object FakeItEasy_CreateMock() [Benchmark(Description = "TUnit.Mocks (Repository)")] public object TUnitMocks_CreateMock_Repository() { - var mock = Mock.Of(); + var mock = IUserRepository.Mock(); return mock.Object; } diff --git a/TUnit.Mocks.Benchmarks/SetupBenchmarks.cs b/TUnit.Mocks.Benchmarks/SetupBenchmarks.cs index 47da647403..5c197d7ff5 100644 --- a/TUnit.Mocks.Benchmarks/SetupBenchmarks.cs +++ b/TUnit.Mocks.Benchmarks/SetupBenchmarks.cs @@ -16,7 +16,7 @@ public class SetupBenchmarks [Benchmark(Description = "TUnit.Mocks")] public object TUnitMocks_Setup() { - var mock = Mock.Of(); + var mock = ICalculatorService.Mock(); mock.Add(TUnitArg.Any(), TUnitArg.Any()).Returns(42); mock.Format(TUnitArg.Any()).Returns("formatted"); mock.Divide(TUnitArg.Any(), TUnitArg.Any()).Returns(1.5); @@ -76,7 +76,7 @@ public object FakeItEasy_Setup() [Benchmark(Description = "TUnit.Mocks (Multiple)")] public object TUnitMocks_MultipleSetups() { - var mock = Mock.Of(); + var mock = IUserRepository.Mock(); mock.GetById(1).Returns(new User { Id = 1, Name = "Alice" }); mock.GetById(2).Returns(new User { Id = 2, Name = "Bob" }); mock.GetById(3).Returns(new User { Id = 3, Name = "Charlie" }); diff --git a/TUnit.Mocks.Benchmarks/VerificationBenchmarks.cs b/TUnit.Mocks.Benchmarks/VerificationBenchmarks.cs index 85d07288f9..c05bfb150e 100644 --- a/TUnit.Mocks.Benchmarks/VerificationBenchmarks.cs +++ b/TUnit.Mocks.Benchmarks/VerificationBenchmarks.cs @@ -17,7 +17,7 @@ public class VerificationBenchmarks [Benchmark(Description = "TUnit.Mocks")] public void TUnitMocks_Verify() { - var mock = Mock.Of(); + var mock = ICalculatorService.Mock(); mock.Add(TUnitArg.Any(), TUnitArg.Any()).Returns(42); var calc = mock.Object; calc.Add(1, 2); @@ -86,7 +86,7 @@ public void FakeItEasy_Verify() [Benchmark(Description = "TUnit.Mocks (Never)")] public void TUnitMocks_VerifyNever() { - var mock = Mock.Of(); + var mock = ICalculatorService.Mock(); mock.Format(TUnitArg.Any()).WasNeverCalled(); } @@ -129,7 +129,7 @@ public void FakeItEasy_VerifyNever() [Benchmark(Description = "TUnit.Mocks (Multiple)")] public void TUnitMocks_VerifyMultiple() { - var mock = Mock.Of(); + var mock = IUserRepository.Mock(); mock.GetById(TUnitArg.Any()).Returns(new User { Id = 1, Name = "Test" }); mock.Exists(TUnitArg.Any()).Returns(true); diff --git a/TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs b/TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs index 88252ae7bd..7433055f9c 100644 --- a/TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs +++ b/TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs @@ -809,6 +809,59 @@ public virtual void DoWork() { } return VerifyGeneratorOutput(source); } + [Test] + public Task Class_With_Constructor_Parameters_Extension_Discovery() + { + var source = """ + using TUnit.Mocks; + + public class MyService + { + public MyService() { } + public MyService(string connectionString, int timeout) { } + public MyService(string connectionString, int timeout, bool verbose) { } + public virtual string GetValue() => "real"; + } + + public class TestUsage + { + void M() + { + var mock = MyService.Mock(); + } + } + """; + + return VerifyGeneratorOutput(source); + } + + [Test] + public Task Class_With_Same_Arity_Constructor_Overloads() + { + var source = """ + using TUnit.Mocks; + + public class MyService + { + public MyService(string name) { } + public MyService(int id) { } + public MyService(string host, int port) { } + public MyService(int timeout, bool verbose) { } + public virtual string GetValue() => "real"; + } + + public class TestUsage + { + void M() + { + var mock = MyService.Mock("test"); + } + } + """; + + return VerifyGeneratorOutput(source); + } + [Test] public Task Static_Extension_Discovery_Without_Mock_Of() { diff --git a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Class_With_Constructor_Parameters_Extension_Discovery.verified.txt b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Class_With_Constructor_Parameters_Extension_Discovery.verified.txt new file mode 100644 index 0000000000..73ea947a8b --- /dev/null +++ b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Class_With_Constructor_Parameters_Extension_Discovery.verified.txt @@ -0,0 +1,145 @@ +// +#nullable enable + +namespace TUnit.Mocks.Generated +{ + file sealed class MyServiceMockImpl : global::MyService, global::TUnit.Mocks.IRaisable, global::TUnit.Mocks.IMockObject + { + private readonly global::TUnit.Mocks.MockEngine _engine; + + [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)] + global::TUnit.Mocks.IMock? global::TUnit.Mocks.IMockObject.MockWrapper { get; set; } + + internal MyServiceMockImpl(global::TUnit.Mocks.MockEngine engine) : base() + { + _engine = engine; + } + internal MyServiceMockImpl(global::TUnit.Mocks.MockEngine engine, string connectionString, int timeout) : base(connectionString, timeout) + { + _engine = engine; + } + internal MyServiceMockImpl(global::TUnit.Mocks.MockEngine engine, string connectionString, int timeout, bool verbose) : base(connectionString, timeout, verbose) + { + _engine = engine; + } + + public override string GetValue() + { + if (_engine.TryHandleCallWithReturn(0, "GetValue", global::System.Array.Empty(), "", out var __result)) + { + return __result; + } + return base.GetValue(); + } + + [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)] + public void RaiseEvent(string eventName, object? args) + { + throw new global::System.InvalidOperationException($"No event named '{eventName}' exists on this mock."); + } + } + + file static class MyServicePartialMockFactory + { + [global::System.Runtime.CompilerServices.ModuleInitializer] + internal static void Register() + { + global::TUnit.Mocks.MockRegistry.RegisterFactory(Create); + } + + private static global::TUnit.Mocks.Mock Create(global::TUnit.Mocks.MockBehavior behavior, object[] constructorArgs) + { + var engine = new global::TUnit.Mocks.MockEngine(behavior); + MyServiceMockImpl impl; + if (constructorArgs.Length == 0) + { + impl = new MyServiceMockImpl(engine); + } + else if (constructorArgs.Length == 2) + { + if ((constructorArgs[0] is null or string) && constructorArgs[1] is int) + { + impl = new MyServiceMockImpl(engine, (string)constructorArgs[0], (int)constructorArgs[1]); + } + else + { + throw new global::System.ArgumentException($"No matching constructor found for type 'global::MyService' with the provided argument types."); + } + } + else if (constructorArgs.Length == 3) + { + if ((constructorArgs[0] is null or string) && constructorArgs[1] is int && constructorArgs[2] is bool) + { + impl = new MyServiceMockImpl(engine, (string)constructorArgs[0], (int)constructorArgs[1], (bool)constructorArgs[2]); + } + else + { + throw new global::System.ArgumentException($"No matching constructor found for type 'global::MyService' with the provided argument types."); + } + } + else + { + throw new global::System.ArgumentException($"No matching constructor found for type 'global::MyService' with {constructorArgs.Length} argument(s)."); + } + engine.Raisable = impl; + var mock = new global::TUnit.Mocks.Mock(impl, engine); + return mock; + } + } +} + + +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks.Generated +{ + public static class MyService_MockMemberExtensions + { + public static global::TUnit.Mocks.MockMethodCall GetValue(this global::TUnit.Mocks.Mock mock) + { + var matchers = global::System.Array.Empty(); + return new global::TUnit.Mocks.MockMethodCall(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetValue", matchers); + } + } +} + + +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks +{ + public static class MyService_MockStaticExtension + { + extension(global::MyService) + { + public static global::TUnit.Mocks.Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior); + } + + public static global::TUnit.Mocks.Mock Mock(string connectionString, int timeout, global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior, connectionString, timeout); + } + + public static global::TUnit.Mocks.Mock Mock(string connectionString, int timeout, bool verbose, global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior, connectionString, timeout, verbose); + } + } + } +} + + +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks.Generated; \ No newline at end of file diff --git a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Class_With_Same_Arity_Constructor_Overloads.verified.txt b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Class_With_Same_Arity_Constructor_Overloads.verified.txt new file mode 100644 index 0000000000..feb92f5bd7 --- /dev/null +++ b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Class_With_Same_Arity_Constructor_Overloads.verified.txt @@ -0,0 +1,163 @@ +// +#nullable enable + +namespace TUnit.Mocks.Generated +{ + file sealed class MyServiceMockImpl : global::MyService, global::TUnit.Mocks.IRaisable, global::TUnit.Mocks.IMockObject + { + private readonly global::TUnit.Mocks.MockEngine _engine; + + [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)] + global::TUnit.Mocks.IMock? global::TUnit.Mocks.IMockObject.MockWrapper { get; set; } + + internal MyServiceMockImpl(global::TUnit.Mocks.MockEngine engine, string name) : base(name) + { + _engine = engine; + } + internal MyServiceMockImpl(global::TUnit.Mocks.MockEngine engine, int id) : base(id) + { + _engine = engine; + } + internal MyServiceMockImpl(global::TUnit.Mocks.MockEngine engine, string host, int port) : base(host, port) + { + _engine = engine; + } + internal MyServiceMockImpl(global::TUnit.Mocks.MockEngine engine, int timeout, bool verbose) : base(timeout, verbose) + { + _engine = engine; + } + + public override string GetValue() + { + if (_engine.TryHandleCallWithReturn(0, "GetValue", global::System.Array.Empty(), "", out var __result)) + { + return __result; + } + return base.GetValue(); + } + + [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)] + public void RaiseEvent(string eventName, object? args) + { + throw new global::System.InvalidOperationException($"No event named '{eventName}' exists on this mock."); + } + } + + file static class MyServicePartialMockFactory + { + [global::System.Runtime.CompilerServices.ModuleInitializer] + internal static void Register() + { + global::TUnit.Mocks.MockRegistry.RegisterFactory(Create); + } + + private static global::TUnit.Mocks.Mock Create(global::TUnit.Mocks.MockBehavior behavior, object[] constructorArgs) + { + var engine = new global::TUnit.Mocks.MockEngine(behavior); + MyServiceMockImpl impl; + if (constructorArgs.Length == 1) + { + if ((constructorArgs[0] is null or string)) + { + impl = new MyServiceMockImpl(engine, (string)constructorArgs[0]); + } + else if (constructorArgs[0] is int) + { + impl = new MyServiceMockImpl(engine, (int)constructorArgs[0]); + } + else + { + throw new global::System.ArgumentException($"No matching constructor found for type 'global::MyService' with the provided argument types."); + } + } + else if (constructorArgs.Length == 2) + { + if ((constructorArgs[0] is null or string) && constructorArgs[1] is int) + { + impl = new MyServiceMockImpl(engine, (string)constructorArgs[0], (int)constructorArgs[1]); + } + else if (constructorArgs[0] is int && constructorArgs[1] is bool) + { + impl = new MyServiceMockImpl(engine, (int)constructorArgs[0], (bool)constructorArgs[1]); + } + else + { + throw new global::System.ArgumentException($"No matching constructor found for type 'global::MyService' with the provided argument types."); + } + } + else + { + throw new global::System.ArgumentException($"No matching constructor found for type 'global::MyService' with {constructorArgs.Length} argument(s)."); + } + engine.Raisable = impl; + var mock = new global::TUnit.Mocks.Mock(impl, engine); + return mock; + } + } +} + + +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks.Generated +{ + public static class MyService_MockMemberExtensions + { + public static global::TUnit.Mocks.MockMethodCall GetValue(this global::TUnit.Mocks.Mock mock) + { + var matchers = global::System.Array.Empty(); + return new global::TUnit.Mocks.MockMethodCall(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetValue", matchers); + } + } +} + + +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks +{ + public static class MyService_MockStaticExtension + { + extension(global::MyService) + { + public static global::TUnit.Mocks.Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior); + } + + public static global::TUnit.Mocks.Mock Mock(string name, global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior, name); + } + + public static global::TUnit.Mocks.Mock Mock(int id, global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior, id); + } + + public static global::TUnit.Mocks.Mock Mock(string host, int port, global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior, host, port); + } + + public static global::TUnit.Mocks.Mock Mock(int timeout, bool verbose, global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior, timeout, verbose); + } + } + } +} + + +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks.Generated; \ No newline at end of file diff --git a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/GenerateMock_Attribute_With_Concrete_Class.verified.txt b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/GenerateMock_Attribute_With_Concrete_Class.verified.txt index d28c2aff42..7b10146b65 100644 --- a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/GenerateMock_Attribute_With_Concrete_Class.verified.txt +++ b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/GenerateMock_Attribute_With_Concrete_Class.verified.txt @@ -84,6 +84,26 @@ namespace TUnit.Mocks.Generated } +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks +{ + public static class MyService_MockStaticExtension + { + extension(global::MyService) + { + public static global::TUnit.Mocks.Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior); + } + } + } +} + + // ===== FILE SEPARATOR ===== // diff --git a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Filters_Internal_Virtual_Members_From_External_Assembly.verified.txt b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Filters_Internal_Virtual_Members_From_External_Assembly.verified.txt index d138493695..cc6e06f113 100644 --- a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Filters_Internal_Virtual_Members_From_External_Assembly.verified.txt +++ b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Filters_Internal_Virtual_Members_From_External_Assembly.verified.txt @@ -196,6 +196,26 @@ namespace TUnit.Mocks.Generated } +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks +{ + public static class ExternalLib_ExternalClient_MockStaticExtension + { + extension(global::ExternalLib.ExternalClient) + { + public static global::TUnit.Mocks.Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior); + } + } + } +} + + // ===== FILE SEPARATOR ===== // diff --git a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Filters_Members_With_Internal_Signature_Types.verified.txt b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Filters_Members_With_Internal_Signature_Types.verified.txt index d9ee40cc69..19cabd788d 100644 --- a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Filters_Members_With_Internal_Signature_Types.verified.txt +++ b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Filters_Members_With_Internal_Signature_Types.verified.txt @@ -156,6 +156,26 @@ namespace TUnit.Mocks.Generated } +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks +{ + public static class ExternalLib_ServiceClient_MockStaticExtension + { + extension(global::ExternalLib.ServiceClient) + { + public static global::TUnit.Mocks.Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior); + } + } + } +} + + // ===== FILE SEPARATOR ===== // diff --git a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Omits_Inaccessible_Property_Setters.verified.txt b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Omits_Inaccessible_Property_Setters.verified.txt index b970ded7ed..c44a583386 100644 --- a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Omits_Inaccessible_Property_Setters.verified.txt +++ b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_Omits_Inaccessible_Property_Setters.verified.txt @@ -109,6 +109,26 @@ namespace TUnit.Mocks.Generated } +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks +{ + public static class ExternalLib_ExternalResponse_MockStaticExtension + { + extension(global::ExternalLib.ExternalResponse) + { + public static global::TUnit.Mocks.Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior); + } + } + } +} + + // ===== FILE SEPARATOR ===== // diff --git a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_With_Generic_Constrained_Virtual_Methods.verified.txt b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_With_Generic_Constrained_Virtual_Methods.verified.txt index f985714752..d5abdd3d97 100644 --- a/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_With_Generic_Constrained_Virtual_Methods.verified.txt +++ b/TUnit.Mocks.SourceGenerator.Tests/Snapshots/Partial_Mock_With_Generic_Constrained_Virtual_Methods.verified.txt @@ -131,6 +131,26 @@ namespace TUnit.Mocks.Generated } +// ===== FILE SEPARATOR ===== + +// +#nullable enable + +namespace TUnit.Mocks +{ + public static class BaseService_MockStaticExtension + { + extension(global::BaseService) + { + public static global::TUnit.Mocks.Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose) + { + return global::TUnit.Mocks.Mock.Of(behavior); + } + } + } +} + + // ===== FILE SEPARATOR ===== // diff --git a/TUnit.Mocks.SourceGenerator/Builders/MockFactoryBuilder.cs b/TUnit.Mocks.SourceGenerator/Builders/MockFactoryBuilder.cs index 80f050135b..b442d42262 100644 --- a/TUnit.Mocks.SourceGenerator/Builders/MockFactoryBuilder.cs +++ b/TUnit.Mocks.SourceGenerator/Builders/MockFactoryBuilder.cs @@ -161,25 +161,9 @@ private static void GenerateConstructorDispatch(CodeWriter writer, MockTypeModel writer.AppendLine($"impl = new {safeName}MockImpl(engine);"); } } - else if (ctorsInGroup.Count == 1) - { - // Single constructor at this arity — simple dispatch - var ctor = ctorsInGroup[0]; - using (writer.Block($"{keyword} (constructorArgs.Length == {group.Key})")) - { - var castArgs = new List(); - for (int i = 0; i < ctor.Parameters.Length; i++) - { - var p = ctor.Parameters[i]; - castArgs.Add($"({p.FullyQualifiedType})constructorArgs[{i}]"); - } - var argList = string.Join(", ", castArgs); - writer.AppendLine($"impl = new {safeName}MockImpl(engine, {argList});"); - } - } else { - // Multiple constructors at the same arity — type-check dispatch + // Type-check dispatch — handles both single and multiple constructors at this arity using (writer.Block($"{keyword} (constructorArgs.Length == {group.Key})")) { bool innerFirst = true; diff --git a/TUnit.Mocks.SourceGenerator/Builders/MockStaticExtensionBuilder.cs b/TUnit.Mocks.SourceGenerator/Builders/MockStaticExtensionBuilder.cs index 4fc99519e8..f8e5ea7487 100644 --- a/TUnit.Mocks.SourceGenerator/Builders/MockStaticExtensionBuilder.cs +++ b/TUnit.Mocks.SourceGenerator/Builders/MockStaticExtensionBuilder.cs @@ -1,3 +1,5 @@ +using System; +using System.Linq; using TUnit.Mocks.SourceGenerator.Models; namespace TUnit.Mocks.SourceGenerator.Builders; @@ -9,12 +11,60 @@ public static string Build(MockTypeModel model) if (!MockWrapperTypeBuilder.CanGenerateWrapper(model)) return string.Empty; - var writer = new CodeWriter(); - // Use full FQN-based safe name for the extension class (in shared TUnit.Mocks namespace, must be globally unique) - var extensionClassName = MockImplBuilder.GetCompositeSafeName(model); - // Use short names for the wrapper type (in namespace-specific namespace) var shortName = MockImplBuilder.GetCompositeShortSafeName(model); var mockNamespace = MockImplBuilder.GetMockNamespace(model); + + return BuildCore(model, (writer, mockableType, visibility) => + { + using (writer.Block($"{visibility} static global::{mockNamespace}.{shortName}Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose)")) + { + writer.AppendLine($"return (global::{mockNamespace}.{shortName}Mock)global::TUnit.Mocks.Mock.Of<{mockableType}>(behavior);"); + } + }); + } + + // No CanGenerateWrapper check — that guard gates interface-specific wrapper type + // generation (e.g. static abstract members, indexers). Class mocks always return + // Mock and don't need a wrapper type. + public static string BuildForPartialMock(MockTypeModel model) + { + return BuildCore(model, (writer, mockableType, visibility) => + { + using (writer.Block($"{visibility} static global::TUnit.Mocks.Mock<{mockableType}> Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose)")) + { + writer.AppendLine($"return global::TUnit.Mocks.Mock.Of<{mockableType}>(behavior);"); + } + + foreach (var ctor in model.Constructors) + { + if (ctor.Parameters.Length == 0) + continue; + + // Skip constructors with ref struct, ref, or out parameters — they can't be passed through params object[] + if (ctor.Parameters.Any(p => p.IsRefStruct || p.Direction is ParameterDirection.Ref or ParameterDirection.Out)) + continue; + + writer.AppendLine(); + + var paramList = string.Join(", ", + ctor.Parameters.Select(FormatParameter) + .Append($"global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose")); + + var argList = string.Join(", ", + ctor.Parameters.Select(p => p.Name)); + + using (writer.Block($"{visibility} static global::TUnit.Mocks.Mock<{mockableType}> Mock({paramList})")) + { + writer.AppendLine($"return global::TUnit.Mocks.Mock.Of<{mockableType}>(behavior, {argList});"); + } + } + }); + } + + private static string BuildCore(MockTypeModel model, Action writeBody) + { + var writer = new CodeWriter(); + var extensionClassName = MockImplBuilder.GetCompositeSafeName(model); var mockableType = MockImplBuilder.GetMockableTypeName(model); writer.AppendLine("// "); @@ -27,14 +77,17 @@ public static string Build(MockTypeModel model) { using (writer.Block($"extension({model.FullyQualifiedName})")) { - using (writer.Block($"{model.Visibility} static global::{mockNamespace}.{shortName}Mock Mock(global::TUnit.Mocks.MockBehavior behavior = global::TUnit.Mocks.MockBehavior.Loose)")) - { - writer.AppendLine($"return (global::{mockNamespace}.{shortName}Mock)global::TUnit.Mocks.Mock.Of<{mockableType}>(behavior);"); - } + writeBody(writer, mockableType, model.Visibility); } } } return writer.ToString(); } + + private static string FormatParameter(MockParameterModel p) + { + var prefix = p.Direction == ParameterDirection.In_Readonly ? "in " : ""; + return $"{prefix}{p.FullyQualifiedType} {p.Name}"; + } } diff --git a/TUnit.Mocks.SourceGenerator/Discovery/MockTypeDiscovery.cs b/TUnit.Mocks.SourceGenerator/Discovery/MockTypeDiscovery.cs index 17bdaf635e..ee280ce79e 100644 --- a/TUnit.Mocks.SourceGenerator/Discovery/MockTypeDiscovery.cs +++ b/TUnit.Mocks.SourceGenerator/Discovery/MockTypeDiscovery.cs @@ -116,7 +116,7 @@ public static ImmutableArray TransformToModels(GeneratorSyntaxCon } // Can't mock sealed classes or structs (analyzers catch this, but skip generation) - if (namedType.IsSealed && namedType.TypeKind != TypeKind.Interface) + if (namedType.IsSealed) return ImmutableArray.Empty; if (namedType.IsValueType) return ImmutableArray.Empty; @@ -413,11 +413,12 @@ private static bool IsEffectivelyPublic(ITypeSymbol type) } } - // ─── IFoo.Mock() static extension discovery ──────────────────── + // ─── T.Mock() static extension discovery ───────────────────────── /// - /// Syntax predicate: matches IFoo.Mock() — a static extension invocation where the + /// Syntax predicate: matches T.Mock() — a static extension invocation where the /// left-hand side is a type name (not a variable/field access). + /// Works for both interfaces (e.g. IFoo.Mock()) and classes (e.g. MyService.Mock()). /// public static bool IsMockExtensionInvocation(SyntaxNode node, CancellationToken ct) { @@ -437,8 +438,8 @@ public static bool IsMockExtensionInvocation(SyntaxNode node, CancellationToken } /// - /// Semantic transform: resolve the left-hand side of X.Mock() to a type symbol. - /// If it's an interface, build a MockTypeModel for it. + /// Semantic transform: resolve the left-hand side of T.Mock() to a type symbol. + /// If it's a mockable type (interface or non-sealed class), build a MockTypeModel for it. /// public static ImmutableArray TransformMockExtensionInvocation( GeneratorSyntaxContext context, CancellationToken ct) @@ -448,17 +449,30 @@ public static ImmutableArray TransformMockExtensionInvocation( // Resolve the LHS to a type symbol first (cheap lookup). var leftSymbol = context.SemanticModel.GetSymbolInfo(memberAccess.Expression, ct); - if (leftSymbol.Symbol is not INamedTypeSymbol { TypeKind: TypeKind.Interface } namedType) + if (leftSymbol.Symbol is not INamedTypeSymbol namedType) + return ImmutableArray.Empty; + + // Can't mock sealed classes, structs, or delegates via the extension + if (namedType.IsValueType) + return ImmutableArray.Empty; + if (namedType.IsSealed) + return ImmutableArray.Empty; + if (namedType.TypeKind is not (TypeKind.Interface or TypeKind.Class)) return ImmutableArray.Empty; // Skip if .Mock() already resolves to a generated specialization (2nd incremental pass). + // The generated per-type extension lives in a class named *_MockStaticExtension. + // This covers both interfaces (wrapper return type in TUnit.Mocks.Generated) and + // classes (Mock return type in TUnit.Mocks). var invocationSymbol = context.SemanticModel.GetSymbolInfo(invocation, ct); if (invocationSymbol.Symbol is IMethodSymbol resolved - && resolved.ReturnType.ContainingNamespace?.ToDisplayString() == "TUnit.Mocks.Generated") + && resolved.ContainingType?.Name is { } containingName + && containingName.EndsWith("_MockStaticExtension")) return ImmutableArray.Empty; + var isPartialMock = namedType.TypeKind == TypeKind.Class; var compilationAssembly = context.SemanticModel.Compilation.Assembly; - return BuildModelWithTransitiveDependencies(namedType, isPartialMock: false, compilationAssembly); + return BuildModelWithTransitiveDependencies(namedType, isPartialMock, compilationAssembly); } // ─── [assembly: GenerateMock(typeof(T))] discovery ──────────────────── @@ -488,7 +502,7 @@ public static ImmutableArray TransformGenerateMockAttribute( continue; // Can't mock sealed classes or structs - if (namedType.IsSealed && namedType.TypeKind != TypeKind.Interface) + if (namedType.IsSealed) continue; if (namedType.IsValueType) continue; diff --git a/TUnit.Mocks.SourceGenerator/MockGenerator.cs b/TUnit.Mocks.SourceGenerator/MockGenerator.cs index d0d86d8c68..a600060a57 100644 --- a/TUnit.Mocks.SourceGenerator/MockGenerator.cs +++ b/TUnit.Mocks.SourceGenerator/MockGenerator.cs @@ -112,6 +112,14 @@ private static void GenerateSingleTypeMock(SourceProductionContext spc, MockType } } } + else if (model.IsPartialMock) + { + var extensionSource = MockStaticExtensionBuilder.BuildForPartialMock(model); + if (!string.IsNullOrEmpty(extensionSource)) + { + spc.AddSource($"{fileName}_MockStaticExtension.g.cs", extensionSource); + } + } } private static void GenerateDelegateMock(SourceProductionContext spc, MockTypeModel model) diff --git a/TUnit.Mocks.Tests/AdditionalCoverageTests.cs b/TUnit.Mocks.Tests/AdditionalCoverageTests.cs index 7303d9c624..5d3f4e45f8 100644 --- a/TUnit.Mocks.Tests/AdditionalCoverageTests.cs +++ b/TUnit.Mocks.Tests/AdditionalCoverageTests.cs @@ -18,7 +18,7 @@ public class MockVerificationExceptionTests public async Task Exception_Properties_Populated_On_Verification_Failure() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Object.Add(1, 2); // Act — verify wrong count @@ -38,7 +38,7 @@ public async Task Exception_Properties_Populated_On_Verification_Failure() public async Task Exception_Message_Contains_Custom_Message() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — verify with custom message var ex = Assert.Throws(() => @@ -54,7 +54,7 @@ public async Task Exception_Message_Contains_Custom_Message() public async Task Exception_ActualCalls_Lists_All_Calls_To_Member() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Object.Add(1, 2); mock.Object.Add(3, 4); mock.Object.Add(5, 6); @@ -145,7 +145,7 @@ public class MockObjectAccessTests [Test] public async Task Object_Property_Returns_Mock_Implementation() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); var calc = mock.Object; @@ -157,7 +157,7 @@ public async Task Object_Property_Returns_Mock_Implementation() [Test] public async Task Object_Property_Returns_Same_Reference() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); var first = mock.Object; var second = mock.Object; @@ -168,7 +168,7 @@ public async Task Object_Property_Returns_Same_Reference() [Test] public async Task IMock_ObjectInstance_Returns_Same_As_Object() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); IMock imock = mock; var fromIMock = imock.ObjectInstance; @@ -205,7 +205,7 @@ public class VerifyAllMessageTests public async Task VerifyAll_Message_Includes_Matcher_Descriptions() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Is(x => x > 0)).Returns(1); // Act — don't call the method @@ -220,7 +220,7 @@ public async Task VerifyAll_Message_Includes_Matcher_Descriptions() public async Task VerifyAll_Message_Lists_Multiple_Uninvoked_Setups() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); mock.GetName().Returns("name"); mock.Log("msg"); @@ -238,7 +238,7 @@ public async Task VerifyAll_Message_Lists_Multiple_Uninvoked_Setups() public async Task VerifyAll_Passes_When_All_Setups_Invoked() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(1); mock.GetName().Returns("name"); @@ -259,7 +259,7 @@ public class InvocationOrderingTests [Test] public async Task Invocations_Are_In_Call_Order() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Object.Add(1, 2); mock.Object.Log("hello"); @@ -277,7 +277,7 @@ public async Task Invocations_Are_In_Call_Order() [Test] public async Task Invocations_Sequence_Numbers_Are_Monotonically_Increasing() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Object.Add(1, 2); mock.Object.GetName(); @@ -305,7 +305,7 @@ public class AutoTrackPropertyResetTests [Test] public async Task Reset_Clears_Auto_Tracked_Property_Values() { - var mock = Mock.Of(); + var mock = ISettingsService.Mock(); mock.SetupAllProperties(); var svc = mock.Object; @@ -332,7 +332,7 @@ public class VerificationCustomMessageTests [Test] public async Task WasNeverCalled_With_Custom_Message() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Object.Add(1, 2); var ex = Assert.Throws(() => @@ -346,7 +346,7 @@ public async Task WasNeverCalled_With_Custom_Message() [Test] public async Task WasCalled_No_Args_With_Custom_Message() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Don't call Add var ex = Assert.Throws(() => @@ -371,7 +371,7 @@ private class FixedStringProvider : IDefaultValueProvider [Test] public async Task DefaultValueProvider_Get_Set_Roundtrip() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); var provider = new FixedStringProvider(); mock.DefaultValueProvider = provider; @@ -398,14 +398,14 @@ public class MockBehaviorPropertyTests [Test] public async Task Loose_Mock_Has_Loose_Behavior() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); await Assert.That(mock.Behavior).IsEqualTo(MockBehavior.Loose); } [Test] public async Task Strict_Mock_Has_Strict_Behavior() { - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); await Assert.That(mock.Behavior).IsEqualTo(MockBehavior.Strict); } } diff --git a/TUnit.Mocks.Tests/ArgumentMatcherTests.cs b/TUnit.Mocks.Tests/ArgumentMatcherTests.cs index 5979963bfa..dd2c97ceb6 100644 --- a/TUnit.Mocks.Tests/ArgumentMatcherTests.cs +++ b/TUnit.Mocks.Tests/ArgumentMatcherTests.cs @@ -17,7 +17,7 @@ public class ArgumentMatcherTests public async Task Arg_Any_Matches_All_Values() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); // Act @@ -34,7 +34,7 @@ public async Task Arg_Any_Matches_All_Values() public async Task Arg_Is_With_Predicate_Matches_When_True() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Is(a => a > 0), Is(b => b > 0)).Returns(100); // Act @@ -54,7 +54,7 @@ public async Task Arg_Is_With_Predicate_Matches_When_True() public async Task Arg_Is_With_Exact_Value() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Is(10), Is(20)).Returns(30); // Act @@ -73,7 +73,7 @@ public async Task Arg_Capture_Captures_Values() { // Arrange var firstArg = Any(); - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(firstArg, Any()).Returns(1); // Act @@ -94,7 +94,7 @@ public async Task Arg_Capture_Captures_Values() public async Task Mixed_Matchers_And_Exact_Values() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // First arg: any int. Second arg: exact 5. mock.Add(Any(), 5).Returns(99); @@ -115,7 +115,7 @@ public async Task Mixed_Matchers_And_Exact_Values() public async Task Arg_IsNull_Matches_Null_Values() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(IsNull()).Returns("got null"); // Act @@ -132,7 +132,7 @@ public async Task Arg_IsNull_Matches_Null_Values() public async Task Arg_IsNotNull_Matches_NonNull_Values() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(IsNotNull()).Returns("got something"); // Act @@ -152,7 +152,7 @@ public async Task Arg_Capture_With_String_Values() { // Arrange var nameArg = Any(); - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(nameArg).Returns("hi"); // Act @@ -171,7 +171,7 @@ public async Task Arg_Capture_With_String_Values() public async Task Multiple_Setups_With_Different_Matchers() { // Arrange — more specific setup first, then broader - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 1).Returns(100); mock.Add(Any(), Any()).Returns(42); @@ -187,7 +187,7 @@ public async Task Multiple_Setups_With_Different_Matchers() public async Task Specific_Setup_After_Any_Takes_Precedence() { // Arrange — broad setup first, then specific - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); mock.Add(1, 1).Returns(100); @@ -215,7 +215,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 = Any(); - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(firstArg, Is(b => b > 100)).Returns(999); ICalculator calc = mock.Object; @@ -239,7 +239,7 @@ public async Task Arg_Capture_Does_Not_Capture_On_Partial_Match() public async Task Arg_IsNull_Matches_Null_Nullable_Value_Type() { // Arrange - var mock = Mock.Of(); + var mock = INullableValueConsumer.Mock(); mock.Process(IsNull()).Returns("got null"); // Act @@ -256,7 +256,7 @@ public async Task Arg_IsNull_Matches_Null_Nullable_Value_Type() public async Task Arg_IsNotNull_Matches_NonNull_Nullable_Value_Type() { // Arrange - var mock = Mock.Of(); + var mock = INullableValueConsumer.Mock(); mock.Process(IsNotNull()).Returns("got value"); // Act @@ -274,7 +274,7 @@ public async Task Arg_IsNotNull_Matches_NonNull_Nullable_Value_Type() public async Task Predicate_Matcher_With_String() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Is(s => s != null && s.StartsWith("A"))).Returns("starts with A"); // Act diff --git a/TUnit.Mocks.Tests/AsyncTests.cs b/TUnit.Mocks.Tests/AsyncTests.cs index 6e192a6bea..df46158d06 100644 --- a/TUnit.Mocks.Tests/AsyncTests.cs +++ b/TUnit.Mocks.Tests/AsyncTests.cs @@ -26,7 +26,7 @@ public class AsyncTests public async Task Task_Int_Returns_Unwrapped_Value() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueAsync().Returns(5); IAsyncService service = mock.Object; @@ -42,7 +42,7 @@ public async Task Task_Int_Returns_Unwrapped_Value() public async Task Task_String_Returns_Unwrapped_Value() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetNameAsync(Any()).Returns("hello"); IAsyncService service = mock.Object; @@ -58,7 +58,7 @@ public async Task Task_String_Returns_Unwrapped_Value() public async Task Task_String_With_Exact_Arg_Match() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetNameAsync("key1").Returns("value1"); mock.GetNameAsync("key2").Returns("value2"); @@ -73,7 +73,7 @@ public async Task Task_String_With_Exact_Arg_Match() public async Task Void_Task_Method_Works_In_Loose_Mode() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); IAsyncService service = mock.Object; @@ -88,7 +88,7 @@ public async Task Void_Task_Method_Works_In_Loose_Mode() public async Task ValueTask_Int_Returns_Unwrapped_Value() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueValueTaskAsync().Returns(42); IAsyncService service = mock.Object; @@ -104,7 +104,7 @@ public async Task ValueTask_Int_Returns_Unwrapped_Value() public async Task Async_Method_Throws_Returns_Faulted_Task() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueAsync().Throws(); IAsyncService service = mock.Object; @@ -132,7 +132,7 @@ public async Task Async_Method_Throws_Returns_Faulted_Task() public async Task Unconfigured_Async_Method_Returns_Default() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); IAsyncService service = mock.Object; @@ -147,7 +147,7 @@ public async Task Unconfigured_Async_Method_Returns_Default() public async Task Unconfigured_Async_String_Method_Returns_Smart_Default() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); IAsyncService service = mock.Object; @@ -162,7 +162,7 @@ public async Task Unconfigured_Async_String_Method_Returns_Smart_Default() public async Task Async_Method_Sequential_Returns() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueAsync().ReturnsSequentially(10, 20, 30); IAsyncService service = mock.Object; @@ -179,7 +179,7 @@ public async Task Async_Method_Sequential_Returns() public async Task Async_Method_Verify_Called() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueAsync().Returns(5); IAsyncService service = mock.Object; @@ -198,7 +198,7 @@ public async Task ReturnsAsync_Task_With_TaskCompletionSource() { // Arrange var tcs = new TaskCompletionSource(); - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueAsync().ReturnsAsync(tcs.Task); IAsyncService service = mock.Object; @@ -220,7 +220,7 @@ public async Task ReturnsAsync_ValueTask_With_TaskCompletionSource() { // Arrange var tcs = new TaskCompletionSource(); - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueValueTaskAsync().ReturnsAsync(new ValueTask(tcs.Task)); IAsyncService service = mock.Object; @@ -242,7 +242,7 @@ public async Task ReturnsAsync_Void_Task_With_TaskCompletionSource() { // Arrange var tcs = new TaskCompletionSource(); - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.DoWorkAsync().ReturnsAsync(tcs.Task); IAsyncService service = mock.Object; @@ -266,7 +266,7 @@ public async Task ReturnsAsync_Factory_Returns_Different_Tasks() var tcs1 = new TaskCompletionSource(); var tcs2 = new TaskCompletionSource(); var callCount = 0; - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueAsync().ReturnsAsync(() => (++callCount == 1) ? tcs1.Task : tcs2.Task); IAsyncService service = mock.Object; @@ -291,7 +291,7 @@ public async Task ReturnsAsync_Then_Returns_Sequence() { // Arrange — mix ReturnsAsync and Returns in a sequence var tcs = new TaskCompletionSource(); - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueAsync() .Returns(1) .Then() @@ -321,7 +321,7 @@ public async Task ReturnsAsync_Then_Returns_Sequence() public async Task ReturnsAsync_Already_Completed_Task() { // Arrange — pass an already-completed task - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetValueAsync().ReturnsAsync(Task.FromResult(123)); IAsyncService service = mock.Object; @@ -336,7 +336,7 @@ public async Task ReturnsAsync_Already_Completed_Task() [Test] public async Task ReturnsAsync_Typed_Factory_Receives_Arguments() { - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetNameAsync(Any()).ReturnsAsync((string key) => Task.FromResult($"value-{key}")); IAsyncService service = mock.Object; @@ -351,7 +351,7 @@ public async Task ReturnsAsync_Typed_Factory_Receives_Arguments() [Test] public async Task ReturnsAsync_Typed_Factory_ValueTask_Receives_Arguments() { - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.ComputeValueTaskAsync(Any()).ReturnsAsync((int input) => new ValueTask(input * 10)); IAsyncService service = mock.Object; @@ -366,7 +366,7 @@ public async Task ReturnsAsync_Typed_Factory_ValueTask_Receives_Arguments() [Test] public async Task ReturnsAsync_Typed_Factory_With_Then_Chain() { - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetNameAsync(Any()) .ReturnsAsync((string key) => Task.FromResult($"first-{key}")) .Then() @@ -384,7 +384,7 @@ public async Task ReturnsAsync_Typed_Factory_With_Then_Chain() [Test] public async Task Typed_Callback_On_Async_Task_Method() { - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); string? capturedKey = null; mock.GetNameAsync(Any()) @@ -401,7 +401,7 @@ public async Task Typed_Callback_On_Async_Task_Method() [Test] public async Task Typed_Callback_On_Async_ValueTask_Method() { - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); int? capturedInput = null; mock.ComputeValueTaskAsync(Any()) @@ -418,7 +418,7 @@ public async Task Typed_Callback_On_Async_ValueTask_Method() [Test] public async Task Typed_Throws_On_Async_Task_Method() { - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetNameAsync(Any()) .Throws((string key) => new InvalidOperationException($"No value for: {key}")); @@ -431,7 +431,7 @@ public async Task Typed_Throws_On_Async_Task_Method() [Test] public async Task Typed_Throws_On_Async_ValueTask_Method() { - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.ComputeValueTaskAsync(Any()) .Throws((int input) => new ArgumentException($"Invalid input: {input}")); diff --git a/TUnit.Mocks.Tests/AsyncVerificationTests.cs b/TUnit.Mocks.Tests/AsyncVerificationTests.cs index a35a251d36..055094109f 100644 --- a/TUnit.Mocks.Tests/AsyncVerificationTests.cs +++ b/TUnit.Mocks.Tests/AsyncVerificationTests.cs @@ -8,7 +8,7 @@ public class AsyncVerificationTests [Test] public async Task WasCalled_Times_Once_Passes() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -21,7 +21,7 @@ await Assert.That(mock.Add(Any(), Any())) [Test] public async Task WasCalled_Times_Exactly_Passes() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -36,7 +36,7 @@ await Assert.That(mock.Add(Any(), Any())) [Test] public async Task WasCalled_Wrong_Count_Fails() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -50,7 +50,7 @@ await Assert.That(mock.Add(Any(), Any())) [Test] public async Task WasNeverCalled_Passes_When_Not_Called() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); await Assert.That(mock.Add(Any(), Any())) .WasNeverCalled(); @@ -59,7 +59,7 @@ await Assert.That(mock.Add(Any(), Any())) [Test] public async Task WasNeverCalled_Fails_When_Called() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -73,7 +73,7 @@ await Assert.That(mock.Add(Any(), Any())) [Test] public async Task WasCalled_AtLeastOnce_Passes() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -87,7 +87,7 @@ await Assert.That(mock.Add(Any(), Any())) [Test] public async Task Property_Getter_WasCalled_Via_Assert() { - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); mock.Name.Returns("Calculator"); IPropertyService svc = mock.Object; @@ -101,7 +101,7 @@ await Assert.That(mock.Name) [Test] public async Task Property_Setter_WasCalled_Via_Assert() { - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); IPropertyService svc = mock.Object; svc.Count = 10; @@ -113,7 +113,7 @@ await Assert.That(mock.Count.Setter) [Test] public async Task Property_Getter_WasNeverCalled_Via_Assert() { - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); await Assert.That(mock.Name) .WasNeverCalled(); @@ -122,7 +122,7 @@ await Assert.That(mock.Name) [Test] public async Task Multiple_Verifications_In_Sequence() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); mock.GetName().Returns("test"); diff --git a/TUnit.Mocks.Tests/AutoMockTests.cs b/TUnit.Mocks.Tests/AutoMockTests.cs index c512cb7127..3b886300fc 100644 --- a/TUnit.Mocks.Tests/AutoMockTests.cs +++ b/TUnit.Mocks.Tests/AutoMockTests.cs @@ -56,7 +56,7 @@ public class AutoMockTests public async Task Interface_Return_Type_Auto_Mocked() { // Arrange - var mock = Mock.Of(); + var mock = IServiceA.Mock(); // Act — no setup for GetServiceB, should auto-mock var serviceB = mock.Object.GetServiceB(); @@ -69,7 +69,7 @@ public async Task Interface_Return_Type_Auto_Mocked() public async Task Auto_Mocked_Return_Is_Functional() { // Arrange - var mock = Mock.Of(); + var mock = IServiceA.Mock(); // Act var serviceB = mock.Object.GetServiceB(); @@ -83,7 +83,7 @@ public async Task Auto_Mocked_Return_Is_Functional() public async Task Same_Instance_On_Repeated_Calls() { // Arrange - var mock = Mock.Of(); + var mock = IServiceA.Mock(); // Act var serviceB1 = mock.Object.GetServiceB(); @@ -97,7 +97,7 @@ public async Task Same_Instance_On_Repeated_Calls() public async Task Nested_Chain_A_To_B_To_C() { // Arrange - var mock = Mock.Of(); + var mock = IServiceA.Mock(); // Act — navigate the chain: A → B → C var serviceB = mock.Object.GetServiceB(); @@ -111,7 +111,7 @@ public async Task Nested_Chain_A_To_B_To_C() public async Task Nested_Chain_Returns_Default_Values() { // Arrange - var mock = Mock.Of(); + var mock = IServiceA.Mock(); // Act var serviceC = mock.Object.GetServiceB().GetServiceC(); @@ -125,7 +125,7 @@ public async Task Nested_Chain_Returns_Default_Values() public async Task Auto_Mock_Configurable_Via_Mock_Get() { // Arrange - var mock = Mock.Of(); + var mock = IServiceA.Mock(); // Trigger auto-mock creation and retrieve the wrapper var serviceB = mock.Object.GetServiceB(); @@ -143,7 +143,7 @@ public async Task Auto_Mock_Configurable_Via_Mock_Get() public void Strict_Mode_Does_Not_Auto_Mock() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = IServiceA.Mock(MockBehavior.Strict); mock.GetName().Returns("test"); // Act & Assert — strict mode throws for unconfigured method @@ -157,8 +157,8 @@ public void Strict_Mode_Does_Not_Auto_Mock() public async Task Explicit_Setup_Overrides_Auto_Mock() { // Arrange - var mock = Mock.Of(); - var customServiceB = Mock.Of(); + var mock = IServiceA.Mock(); + var customServiceB = IServiceB.Mock(); customServiceB.GetValue().Returns(99); mock.GetServiceB().Returns(customServiceB.Object); @@ -174,7 +174,7 @@ public async Task Explicit_Setup_Overrides_Auto_Mock() public async Task Auto_Mock_With_Circular_References() { // Arrange - var mock = Mock.Of(); + var mock = INodeA.Mock(); // Act — navigate circular reference var nodeB = mock.Object.GetNext(); @@ -187,7 +187,7 @@ public async Task Auto_Mock_With_Circular_References() public async Task Async_Method_Returns_Auto_Mock() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncProvider.Mock(); // Act — async method returning Task var serviceB = await mock.Object.GetServiceAsync(); @@ -200,7 +200,7 @@ public async Task Async_Method_Returns_Auto_Mock() public async Task Non_Interface_Return_Type_Returns_Default() { // Arrange - var mock = Mock.Of(); + var mock = IServiceA.Mock(); // Act — GetName returns string, not an interface var name = mock.Object.GetName(); diff --git a/TUnit.Mocks.Tests/AutoRaiseEventTests.cs b/TUnit.Mocks.Tests/AutoRaiseEventTests.cs index 8925634376..b843a009f1 100644 --- a/TUnit.Mocks.Tests/AutoRaiseEventTests.cs +++ b/TUnit.Mocks.Tests/AutoRaiseEventTests.cs @@ -20,7 +20,7 @@ public class AutoRaiseEventTests [Test] public async Task Raises_Event_When_Method_Returns_Value() { - var mock = Mock.Of(); + var mock = IProcessService.Mock(); string? receivedStatus = null; mock.Object.StatusChanged += (sender, status) => receivedStatus = status; @@ -37,7 +37,7 @@ public async Task Raises_Event_When_Method_Returns_Value() [Test] public async Task Raises_Event_When_Void_Method_Called() { - var mock = Mock.Of(); + var mock = IProcessService.Mock(); string? receivedStatus = null; mock.Object.StatusChanged += (sender, status) => receivedStatus = status; @@ -53,7 +53,7 @@ public async Task Raises_Event_When_Void_Method_Called() [Test] public async Task Multiple_Raises_Fire_In_Order() { - var mock = Mock.Of(); + var mock = IProcessService.Mock(); var receivedStatuses = new List(); mock.Object.StatusChanged += (sender, status) => receivedStatuses.Add(status); @@ -73,7 +73,7 @@ public async Task Multiple_Raises_Fire_In_Order() [Test] public async Task Raises_With_No_Subscribers_Does_Not_Throw() { - var mock = Mock.Of(); + var mock = IProcessService.Mock(); mock.Process(Any()) .Returns(true) @@ -88,7 +88,7 @@ public async Task Raises_With_No_Subscribers_Does_Not_Throw() [Test] public async Task Raises_On_Each_Call() { - var mock = Mock.Of(); + var mock = IProcessService.Mock(); var callCount = 0; mock.Object.StatusChanged += (sender, status) => callCount++; @@ -107,7 +107,7 @@ public async Task Raises_On_Each_Call() [Test] public async Task Raises_Event_From_Zero_Param_Void_Method() { - var mock = Mock.Of(); + var mock = IMultiEventService.Mock(); var wasCalled = false; mock.Object.OnSimple += () => wasCalled = true; @@ -123,7 +123,7 @@ public async Task Raises_Event_From_Zero_Param_Void_Method() [Test] public async Task Raises_Event_From_Zero_Param_Return_Method() { - var mock = Mock.Of(); + var mock = IMultiEventService.Mock(); var wasCalled = false; mock.Object.OnSimple += () => wasCalled = true; @@ -141,7 +141,7 @@ public async Task Raises_Event_From_Zero_Param_Return_Method() [Test] public async Task Raises_Multi_Param_Event_Unpacks_Arguments() { - var mock = Mock.Of(); + var mock = IMultiEventService.Mock(); string? receivedName = null; int receivedCount = 0; diff --git a/TUnit.Mocks.Tests/AutoTrackPropertyTests.cs b/TUnit.Mocks.Tests/AutoTrackPropertyTests.cs index 859f67191b..6c71aae746 100644 --- a/TUnit.Mocks.Tests/AutoTrackPropertyTests.cs +++ b/TUnit.Mocks.Tests/AutoTrackPropertyTests.cs @@ -22,7 +22,7 @@ public class AutoTrackPropertyTests public async Task AutoTrack_Set_Then_Get_Returns_Value() { // Arrange — opt in to auto-tracking - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); mock.SetupAllProperties(); // Act @@ -37,7 +37,7 @@ public async Task AutoTrack_Set_Then_Get_Returns_Value() public async Task AutoTrack_Multiple_Properties_Track_Independently() { // Arrange - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); mock.SetupAllProperties(); // Act @@ -55,7 +55,7 @@ public async Task AutoTrack_Multiple_Properties_Track_Independently() public async Task AutoTrack_Unset_Returns_Smart_Default() { // Arrange - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); // Assert — unset properties return smart defaults await Assert.That(mock.Object.Name).IsEmpty(); @@ -67,7 +67,7 @@ public async Task AutoTrack_Unset_Returns_Smart_Default() public async Task Explicit_Setup_Overrides_AutoTrack() { // Arrange - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); mock.SetupAllProperties(); mock.Name.Returns("Configured"); @@ -82,7 +82,7 @@ public async Task Explicit_Setup_Overrides_AutoTrack() public async Task AutoTrack_Overwrite_Value() { // Arrange - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); mock.SetupAllProperties(); // Act — set then overwrite @@ -97,7 +97,7 @@ public async Task AutoTrack_Overwrite_Value() public async Task Loose_Mode_Does_Not_AutoTrack_By_Default() { // Arrange — loose mode does NOT auto-track; requires explicit SetupAllProperties() - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); // Act mock.Object.Name = "Alice"; @@ -110,7 +110,7 @@ public async Task Loose_Mode_Does_Not_AutoTrack_By_Default() public async Task Loose_Mode_AutoTracks_After_SetupAllProperties() { // Arrange — explicit opt-in enables auto-tracking - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); mock.SetupAllProperties(); // Act @@ -124,7 +124,7 @@ public async Task Loose_Mode_AutoTracks_After_SetupAllProperties() public async Task Strict_Mode_Does_Not_AutoTrack_By_Default() { // Arrange — strict mode requires explicit SetupAllProperties - var mock = Mock.Of(MockBehavior.Strict); + var mock = IAutoTrackEntity.Mock(MockBehavior.Strict); mock.Name.Set(Any()); mock.Name.Returns(""); @@ -139,7 +139,7 @@ public async Task Strict_Mode_Does_Not_AutoTrack_By_Default() public async Task Strict_Mode_With_SetupAllProperties_Tracks() { // Arrange — strict mode with explicit opt-in - var mock = Mock.Of(MockBehavior.Strict); + var mock = IAutoTrackEntity.Mock(MockBehavior.Strict); mock.SetupAllProperties(); mock.Name.Set(Any()); mock.Name.Returns(""); @@ -155,7 +155,7 @@ public async Task Strict_Mode_With_SetupAllProperties_Tracks() public async Task Reset_Clears_Tracked_Values_But_Keeps_AutoTrack() { // Arrange - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); mock.SetupAllProperties(); mock.Object.Name = "Alice"; @@ -174,7 +174,7 @@ public async Task Reset_Clears_Tracked_Values_But_Keeps_AutoTrack() public async Task ReadOnly_Property_Returns_Default() { // Arrange - var mock = Mock.Of(); + var mock = IAutoTrackEntity.Mock(); // Assert — read-only property has no setter, returns smart default await Assert.That(mock.Object.ReadOnly).IsEmpty(); diff --git a/TUnit.Mocks.Tests/BasicMockTests.cs b/TUnit.Mocks.Tests/BasicMockTests.cs index e28facf8d0..2d9c27c225 100644 --- a/TUnit.Mocks.Tests/BasicMockTests.cs +++ b/TUnit.Mocks.Tests/BasicMockTests.cs @@ -27,7 +27,7 @@ public class BasicMockTests public async Task Mock_Of_Creates_Mock_Instance() { // Arrange & Act - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Assert await Assert.That(mock).IsNotNull(); @@ -38,7 +38,7 @@ public async Task Mock_Of_Creates_Mock_Instance() public async Task Setup_Returns_Configures_Return_Value() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(2, 3).Returns(5); // Act @@ -53,7 +53,7 @@ public async Task Setup_Returns_Configures_Return_Value() public async Task Setup_Returns_With_String() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet("Alice").Returns("Hello, Alice!"); // Act @@ -68,7 +68,7 @@ public async Task Setup_Returns_With_String() public async Task Unconfigured_Method_Returns_Default() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act ICalculator calc = mock.Object; @@ -82,7 +82,7 @@ public async Task Unconfigured_Method_Returns_Default() public async Task Implicit_Conversion_To_Interface() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — .Object access ICalculator calc = mock.Object; @@ -95,7 +95,7 @@ public async Task Implicit_Conversion_To_Interface() public async Task Multiple_Setups_Last_Wins() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 1).Returns(10); mock.Add(1, 1).Returns(20); // Last setup wins @@ -111,7 +111,7 @@ public async Task Multiple_Setups_Last_Wins() public async Task Different_Args_Different_Returns() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); mock.Add(10, 20).Returns(30); @@ -128,7 +128,7 @@ public async Task Different_Args_Different_Returns() public void Void_Method_Does_Not_Throw_In_Loose_Mode() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act & Assert — should not throw ICalculator calc = mock.Object; @@ -139,7 +139,7 @@ public void Void_Method_Does_Not_Throw_In_Loose_Mode() public async Task String_Method_Unconfigured_Returns_Default() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act ICalculator calc = mock.Object; @@ -153,7 +153,7 @@ public async Task String_Method_Unconfigured_Returns_Default() public async Task Reset_Clears_Setups() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 1).Returns(42); ICalculator calc = mock.Object; diff --git a/TUnit.Mocks.Tests/CallbackTests.cs b/TUnit.Mocks.Tests/CallbackTests.cs index 9c97005c45..9d873fa90c 100644 --- a/TUnit.Mocks.Tests/CallbackTests.cs +++ b/TUnit.Mocks.Tests/CallbackTests.cs @@ -13,7 +13,7 @@ public async Task Callback_Is_Invoked_When_Method_Is_Called() { // Arrange var callbackInvoked = false; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Log(Any()) .Callback(() => callbackInvoked = true); @@ -31,7 +31,7 @@ public async Task Callback_With_Returns_Both_Execute() { // Arrange var callbackInvoked = false; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Callback(() => callbackInvoked = true) .Then() @@ -54,7 +54,7 @@ public async Task Multiple_Callbacks_Via_Chaining() { // Arrange var callCount = 0; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Log(Any()) .Callback(() => callCount++) .Then() @@ -75,7 +75,7 @@ public async Task Callback_Invoked_For_Each_Call() { // Arrange var callCount = 0; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Log(Any()) .Callback(() => callCount++); @@ -95,7 +95,7 @@ public async Task Callback_On_Method_With_Return_Value() { // Arrange var lastArgs = ""; - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Any()) .Callback(() => lastArgs = "called") .Then() @@ -119,7 +119,7 @@ public async Task Computed_Return_Via_Factory() { // Arrange var counter = 0; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Returns(() => ++counter); diff --git a/TUnit.Mocks.Tests/CollectionMatcherTests.cs b/TUnit.Mocks.Tests/CollectionMatcherTests.cs index 8b790d73da..930bc2d377 100644 --- a/TUnit.Mocks.Tests/CollectionMatcherTests.cs +++ b/TUnit.Mocks.Tests/CollectionMatcherTests.cs @@ -20,7 +20,7 @@ public class CollectionMatcherTests public async Task Arg_Contains_Matches_List_With_Item() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.ProcessItems(Contains, int>(42)).Returns(1); // Act @@ -35,7 +35,7 @@ public async Task Arg_Contains_Matches_List_With_Item() public async Task Arg_Contains_Does_Not_Match_Without_Item() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.ProcessItems(Contains, int>(42)).Returns(1); // Act @@ -50,7 +50,7 @@ public async Task Arg_Contains_Does_Not_Match_Without_Item() public async Task Arg_HasCount_Matches_List_With_Exact_Count() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.ProcessItems(HasCount>(3)).Returns(99); // Act @@ -65,7 +65,7 @@ public async Task Arg_HasCount_Matches_List_With_Exact_Count() public async Task Arg_HasCount_Does_Not_Match_Wrong_Count() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.ProcessItems(HasCount>(3)).Returns(99); // Act @@ -80,7 +80,7 @@ public async Task Arg_HasCount_Does_Not_Match_Wrong_Count() public async Task Arg_IsEmpty_Matches_Empty_List() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.ProcessItems(IsEmpty>()).Returns(77); // Act @@ -94,7 +94,7 @@ public async Task Arg_IsEmpty_Matches_Empty_List() public async Task Arg_IsEmpty_Does_Not_Match_NonEmpty() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.ProcessItems(IsEmpty>()).Returns(77); // Act @@ -108,7 +108,7 @@ public async Task Arg_IsEmpty_Does_Not_Match_NonEmpty() public async Task Arg_SequenceEquals_Matches_Exact_Sequence() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.ProcessItems(SequenceEquals, int>(new[] { 1, 2, 3 })).Returns(55); // Act @@ -122,7 +122,7 @@ public async Task Arg_SequenceEquals_Matches_Exact_Sequence() public async Task Arg_SequenceEquals_Does_Not_Match_Different_Sequence() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.ProcessItems(SequenceEquals, int>(new[] { 1, 2, 3 })).Returns(55); // Act @@ -138,7 +138,7 @@ public async Task Arg_SequenceEquals_Does_Not_Match_Different_Sequence() public async Task Arg_SequenceEquals_With_Strings() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.JoinNames(SequenceEquals, string>(new[] { "a", "b" })).Returns("matched"); // Act @@ -154,7 +154,7 @@ public async Task Arg_SequenceEquals_With_Strings() public async Task Arg_Contains_With_Strings() { // Arrange - var mock = Mock.Of(); + var mock = ICollectionService.Mock(); mock.JoinNames(Contains, string>("hello")).Returns("found"); // Act diff --git a/TUnit.Mocks.Tests/ComprehensiveOutRefSpanTests.cs b/TUnit.Mocks.Tests/ComprehensiveOutRefSpanTests.cs index 3e7f085bd2..d629e665a3 100644 --- a/TUnit.Mocks.Tests/ComprehensiveOutRefSpanTests.cs +++ b/TUnit.Mocks.Tests/ComprehensiveOutRefSpanTests.cs @@ -68,7 +68,7 @@ public class OutMutableSpanTests [Test] public async Task Out_Span_Empty() { - var mock = Mock.Of(); + var mock = IMutableSpanOutput.Mock(); mock.Fill().SetsOutBuffer(Span.Empty); mock.Object.Fill(out var buffer); @@ -80,7 +80,7 @@ public async Task Out_Span_Empty() [Test] public async Task Out_Span_With_Data() { - var mock = Mock.Of(); + var mock = IMutableSpanOutput.Mock(); mock.Fill().SetsOutBuffer(new Span([10, 20, 30])); mock.Object.Fill(out var buffer); @@ -98,7 +98,7 @@ public async Task Out_Span_With_Data() [Test] public async Task Out_Span_With_Returns_And_Mixed_Params() { - var mock = Mock.Of(); + var mock = IMutableSpanOutput.Mock(); mock.Write("hello") .Returns(5) .SetsOutWritten(new Span([0x68, 0x65, 0x6C])); @@ -116,7 +116,7 @@ public async Task Out_Span_With_Returns_And_Mixed_Params() public async Task Out_Span_Callback_Fires() { var wasCalled = false; - var mock = Mock.Of(); + var mock = IMutableSpanOutput.Mock(); mock.Fill() .Callback(() => wasCalled = true) .SetsOutBuffer(new Span([1])); @@ -129,7 +129,7 @@ public async Task Out_Span_Callback_Fires() [Test] public async Task Out_Span_Throws() { - var mock = Mock.Of(); + var mock = IMutableSpanOutput.Mock(); mock.Fill().Throws(); var ex = Assert.Throws(() => mock.Object.Fill(out _)); @@ -140,7 +140,7 @@ public async Task Out_Span_Throws() [Test] public async Task Out_Span_Verification() { - var mock = Mock.Of(); + var mock = IMutableSpanOutput.Mock(); mock.Object.Fill(out _); mock.Object.Fill(out _); @@ -151,7 +151,7 @@ public async Task Out_Span_Verification() [Test] public async Task Out_Span_Never_Called() { - var mock = Mock.Of(); + var mock = IMutableSpanOutput.Mock(); mock.Fill().WasNeverCalled(); await Assert.That(true).IsTrue(); @@ -167,7 +167,7 @@ public class OutReadOnlySpanCharTests [Test] public async Task Out_ReadOnlySpan_Char_With_Data() { - var mock = Mock.Of(); + var mock = ICharSpanReader.Mock(); mock.TryReadLine() .Returns(true) .SetsOutLine("hello world".AsSpan()); @@ -186,7 +186,7 @@ public async Task Out_ReadOnlySpan_Char_With_Data() [Test] public async Task Out_ReadOnlySpan_Char_Empty() { - var mock = Mock.Of(); + var mock = ICharSpanReader.Mock(); mock.TryReadLine() .Returns(false) .SetsOutLine(ReadOnlySpan.Empty); @@ -201,7 +201,7 @@ public async Task Out_ReadOnlySpan_Char_Empty() [Test] public async Task Out_ReadOnlySpan_Char_Mixed_Params_With_Matchers() { - var mock = Mock.Of(); + var mock = ICharSpanReader.Mock(); mock.GetToken("CSV") .Returns(3) .SetsOutToken("foo".AsSpan()); @@ -231,7 +231,7 @@ public async Task Out_ReadOnlySpan_Char_Mixed_Params_With_Matchers() [Test] public async Task Out_ReadOnlySpan_Char_Arg_Any_Matcher() { - var mock = Mock.Of(); + var mock = ICharSpanReader.Mock(); mock.GetToken(Any()) .Returns(1) .SetsOutToken("x".AsSpan()); @@ -250,7 +250,7 @@ public async Task Out_ReadOnlySpan_Char_Arg_Any_Matcher() [Test] public async Task Out_ReadOnlySpan_Char_Arg_Is_Predicate() { - var mock = Mock.Of(); + var mock = ICharSpanReader.Mock(); mock.GetToken(Is(s => s.StartsWith("J"))) .Returns(42) .SetsOutToken("json".AsSpan()); @@ -270,7 +270,7 @@ public async Task Out_ReadOnlySpan_Char_Arg_Is_Predicate() [Test] public async Task Out_ReadOnlySpan_Char_Verification_Multiple() { - var mock = Mock.Of(); + var mock = ICharSpanReader.Mock(); mock.GetToken(Any()).Returns(0); mock.Object.GetToken("a", out _); @@ -294,7 +294,7 @@ public class MultipleOutParamsTests [Test] public async Task Multiple_Out_Int_And_Span() { - var mock = Mock.Of(); + var mock = IMultiOutput.Mock(); mock.Extract("test") .Returns(true) .SetsOutCount(3) @@ -316,7 +316,7 @@ public async Task Multiple_Out_Int_And_Span() public async Task Multiple_Out_Only_Int_Set() { // Only set the int out param, span stays default - var mock = Mock.Of(); + var mock = IMultiOutput.Mock(); mock.Extract("partial") .Returns(true) .SetsOutCount(7); @@ -333,7 +333,7 @@ public async Task Multiple_Out_Only_Int_Set() public async Task Multiple_Out_Only_Span_Set() { // Only set the span out param, int stays default - var mock = Mock.Of(); + var mock = IMultiOutput.Mock(); mock.Extract("data-only") .Returns(false) .SetsOutData(new ReadOnlySpan([1, 2])); @@ -349,7 +349,7 @@ public async Task Multiple_Out_Only_Span_Set() [Test] public async Task Multiple_Out_Chain_Order_SetsOut_Before_Returns() { - var mock = Mock.Of(); + var mock = IMultiOutput.Mock(); mock.Extract(Any()) .SetsOutCount(99) .SetsOutData(new ReadOnlySpan([0xFF])) @@ -366,7 +366,7 @@ public async Task Multiple_Out_Chain_Order_SetsOut_Before_Returns() [Test] public async Task Multiple_Out_Different_Setups_Per_Input() { - var mock = Mock.Of(); + var mock = IMultiOutput.Mock(); mock.Extract("alpha") .Returns(true) .SetsOutCount(1) @@ -399,7 +399,7 @@ public async Task Multiple_Out_Different_Setups_Per_Input() public async Task Multiple_Out_Callback_With_Args() { string? capturedInput = null; - var mock = Mock.Of(); + var mock = IMultiOutput.Mock(); mock.Extract(Any()) .Callback((string input) => capturedInput = input) .Returns(true) @@ -414,7 +414,7 @@ public async Task Multiple_Out_Callback_With_Args() [Test] public async Task Multiple_Out_Throws_Exception() { - var mock = Mock.Of(); + var mock = IMultiOutput.Mock(); mock.Extract("bad").Throws(); var ex = Assert.Throws(() => @@ -426,7 +426,7 @@ public async Task Multiple_Out_Throws_Exception() [Test] public async Task Multiple_Out_Verification() { - var mock = Mock.Of(); + var mock = IMultiOutput.Mock(); mock.Extract(Any()).Returns(false); mock.Object.Extract("a", out _, out _); @@ -450,7 +450,7 @@ public class RefAndOutSpanTests [Test] public async Task Ref_Int_And_Out_Span() { - var mock = Mock.Of(); + var mock = ICodec.Mock(); mock.Decode(0) .Returns(true) .SetsRefOffset(10) @@ -472,7 +472,7 @@ public async Task Ref_Int_And_Out_Span() [Test] public async Task Ref_Int_And_Out_Span_Different_Offsets() { - var mock = Mock.Of(); + var mock = ICodec.Mock(); mock.Decode(0) .Returns(true) .SetsRefOffset(5) @@ -512,7 +512,7 @@ public async Task Ref_Int_And_Out_Span_Different_Offsets() [Test] public async Task Ref_And_Out_Span_With_Any_Matcher() { - var mock = Mock.Of(); + var mock = ICodec.Mock(); mock.Decode(Any()) .Returns(true) .SetsRefOffset(100) @@ -530,7 +530,7 @@ public async Task Ref_And_Out_Span_With_Any_Matcher() [Test] public async Task Ref_And_Out_Span_Verification() { - var mock = Mock.Of(); + var mock = ICodec.Mock(); mock.Decode(Any()).Returns(false); int p1 = 0, p2 = 5; @@ -547,7 +547,7 @@ public async Task Ref_And_Out_Span_Verification() [Test] public async Task Ref_And_Out_Span_Throws() { - var mock = Mock.Of(); + var mock = ICodec.Mock(); mock.Decode(-1).Throws(); int bad = -1; @@ -561,7 +561,7 @@ public async Task Ref_And_Out_Span_Throws() public async Task Ref_And_Out_Span_Callback() { var wasCalled = false; - var mock = Mock.Of(); + var mock = ICodec.Mock(); mock.Decode(Any()) .Callback(() => wasCalled = true) .Returns(true) @@ -584,7 +584,7 @@ public class SpanInputAndOutputTests [Test] public async Task RefStructArg_Input_With_Out_Span() { - var mock = Mock.Of(); + var mock = ITransformer.Mock(); mock.Transform(RefStructArg>.Any) .SetsOutOutput(new ReadOnlySpan([0xDE, 0xAD])); @@ -602,7 +602,7 @@ public async Task RefStructArg_Input_With_Out_Span() public async Task RefStructArg_Input_With_Out_Span_Callback() { var wasCalled = false; - var mock = Mock.Of(); + var mock = ITransformer.Mock(); mock.Transform(RefStructArg>.Any) .Callback(() => wasCalled = true) .SetsOutOutput(new ReadOnlySpan([1])); @@ -615,7 +615,7 @@ public async Task RefStructArg_Input_With_Out_Span_Callback() [Test] public async Task RefStructArg_Input_With_Out_Span_Throws() { - var mock = Mock.Of(); + var mock = ITransformer.Mock(); mock.Transform(RefStructArg>.Any) .Throws(); @@ -628,7 +628,7 @@ public async Task RefStructArg_Input_With_Out_Span_Throws() [Test] public async Task RefStructArg_Input_With_Out_Span_Verification() { - var mock = Mock.Of(); + var mock = ITransformer.Mock(); mock.Object.Transform(new byte[] { 1 }, out _); mock.Object.Transform(ReadOnlySpan.Empty, out _); @@ -640,7 +640,7 @@ public async Task RefStructArg_Input_With_Out_Span_Verification() public async Task PreNet9_Span_Input_With_Out_Span() { // Pre-NET9: ref struct input excluded from matching - var mock = Mock.Of(); + var mock = ITransformer.Mock(); mock.Transform() .SetsOutOutput(new ReadOnlySpan([0xBE, 0xEF])); @@ -655,7 +655,7 @@ public async Task PreNet9_Span_Input_With_Out_Span() [Test] public async Task PreNet9_Span_Input_Verification() { - var mock = Mock.Of(); + var mock = ITransformer.Mock(); mock.Object.Transform(new byte[] { 1 }, out _); mock.Object.Transform(ReadOnlySpan.Empty, out _); @@ -674,7 +674,7 @@ public class ComprehensiveRefTests [Test] public async Task Ref_With_Return_Value() { - var mock = Mock.Of(); + var mock = ICounter.Mock(); mock.Increment(Any(), 1) .Returns(1) .SetsRefValue(11); @@ -689,7 +689,7 @@ public async Task Ref_With_Return_Value() [Test] public async Task Ref_Exact_Value_Matching() { - var mock = Mock.Of(); + var mock = ICounter.Mock(); mock.Increment(10, 1).Returns(11).SetsRefValue(11); mock.Increment(20, 1).Returns(21).SetsRefValue(21); @@ -708,7 +708,7 @@ public async Task Ref_Exact_Value_Matching() [Test] public async Task Ref_Predicate_Matching() { - var mock = Mock.Of(); + var mock = ICounter.Mock(); mock.TryAdvance(Is(v => v >= 0), 100) .Returns(true) .SetsRefPosition(50); @@ -731,7 +731,7 @@ public async Task Ref_Predicate_Matching() [Test] public async Task Ref_Void_Method() { - var mock = Mock.Of(); + var mock = ICounter.Mock(); mock.Clear(Any()).SetsRefValue(0); int val = 42; @@ -743,7 +743,7 @@ public async Task Ref_Void_Method() [Test] public async Task Ref_Not_Modified_Without_Setup() { - var mock = Mock.Of(); + var mock = ICounter.Mock(); // No SetsRefValue configured int val = 42; @@ -757,7 +757,7 @@ public async Task Ref_Not_Modified_Without_Setup() public async Task Ref_Callback_Fires() { var wasCalled = false; - var mock = Mock.Of(); + var mock = ICounter.Mock(); mock.Clear(Any()) .Callback(() => wasCalled = true) .SetsRefValue(0); @@ -772,7 +772,7 @@ public async Task Ref_Callback_Fires() [Test] public async Task Ref_Throws() { - var mock = Mock.Of(); + var mock = ICounter.Mock(); mock.Increment(Any(), 0).Throws(); int val = 1; @@ -784,7 +784,7 @@ public async Task Ref_Throws() [Test] public async Task Ref_Verification_With_Exact_Value() { - var mock = Mock.Of(); + var mock = ICounter.Mock(); mock.Increment(Any(), Any()).Returns(0); int v1 = 5, v2 = 10; @@ -801,7 +801,7 @@ public async Task Ref_Verification_With_Exact_Value() [Test] public async Task Ref_Verification_AtLeast_AtMost() { - var mock = Mock.Of(); + var mock = ICounter.Mock(); mock.Clear(Any()); int v = 1; @@ -825,7 +825,7 @@ public class RefAndOutCombinedTests [Test] public async Task Ref_And_Out_Both_Set() { - var mock = Mock.Of(); + var mock = ISwapper.Mock(); mock.SwapAndReport(42) .SetsRefValue(0) .SetsOutReport("swapped 42 to 0"); @@ -840,7 +840,7 @@ public async Task Ref_And_Out_Both_Set() [Test] public async Task Ref_And_Out_Only_Ref_Set() { - var mock = Mock.Of(); + var mock = ISwapper.Mock(); mock.SwapAndReport(Any()).SetsRefValue(99); int val = 1; @@ -853,7 +853,7 @@ public async Task Ref_And_Out_Only_Ref_Set() [Test] public async Task Ref_And_Out_Only_Out_Set() { - var mock = Mock.Of(); + var mock = ISwapper.Mock(); mock.SwapAndReport(Any()).SetsOutReport("report"); int val = 50; @@ -868,7 +868,7 @@ public async Task Ref_And_Out_Only_Out_Set() public async Task Ref_And_Out_Callback() { var wasCalled = false; - var mock = Mock.Of(); + var mock = ISwapper.Mock(); mock.SwapAndReport(Any()) .Callback(() => wasCalled = true) .SetsRefValue(0) @@ -883,7 +883,7 @@ public async Task Ref_And_Out_Callback() [Test] public async Task Ref_And_Out_Throws() { - var mock = Mock.Of(); + var mock = ISwapper.Mock(); mock.SwapAndReport(-1).Throws(); int val = -1; @@ -896,7 +896,7 @@ public async Task Ref_And_Out_Throws() [Test] public async Task Ref_And_Out_Verification() { - var mock = Mock.Of(); + var mock = ISwapper.Mock(); int v1 = 1, v2 = 2; mock.Object.SwapAndReport(ref v1, out _); @@ -919,7 +919,7 @@ public class DualSpanOutputTests [Test] public async Task Two_Span_Out_Params_Both_Set() { - var mock = Mock.Of(); + var mock = IDualSpanOutput.Mock(); mock.Split("hello") .SetsOutBytes(new ReadOnlySpan([0x68, 0x65])) .SetsOutChars("hi".AsSpan()); @@ -939,7 +939,7 @@ public async Task Two_Span_Out_Params_Both_Set() [Test] public async Task Two_Span_Out_Only_First_Set() { - var mock = Mock.Of(); + var mock = IDualSpanOutput.Mock(); mock.Split("partial") .SetsOutBytes(new ReadOnlySpan([1, 2, 3])); @@ -954,7 +954,7 @@ public async Task Two_Span_Out_Only_First_Set() [Test] public async Task Two_Span_Out_Only_Second_Set() { - var mock = Mock.Of(); + var mock = IDualSpanOutput.Mock(); mock.Split("chars-only") .SetsOutChars("abc".AsSpan()); @@ -971,7 +971,7 @@ public async Task Two_Span_Out_Only_Second_Set() [Test] public async Task Two_Span_Out_Verification() { - var mock = Mock.Of(); + var mock = IDualSpanOutput.Mock(); mock.Object.Split("a", out _, out _); mock.Object.Split("b", out _, out _); @@ -986,7 +986,7 @@ public async Task Two_Span_Out_Verification() [Test] public async Task Two_Span_Out_Throws() { - var mock = Mock.Of(); + var mock = IDualSpanOutput.Mock(); mock.Split("").Throws(); var ex = Assert.Throws(() => @@ -1006,7 +1006,7 @@ public class SequentialSpanSetupTests public async Task Then_Returns_Sequence_With_Out_Span() { // SetsOut applies at setup level; Then() sequences Returns/Callback/Throws - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse(Any()) .SetsOutData(new ReadOnlySpan([0xAA])) .Returns(true) @@ -1032,7 +1032,7 @@ public async Task Then_Returns_Sequence_With_Out_Span() [Test] public async Task Then_Throws_After_Success_With_Out_Span() { - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse("data") .Returns(true) .SetsOutData(new ReadOnlySpan([0xAA])) @@ -1057,7 +1057,7 @@ public async Task Then_Callback_Sequence_With_Out_Span() { // Callbacks sequence correctly with Then(), span stays constant var callCount = 0; - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Do() .Callback(() => callCount++) .SetsOutBuffer(new ReadOnlySpan([0xFF])) @@ -1078,7 +1078,7 @@ public async Task Then_Callback_Sequence_With_Out_Span() [Test] public async Task ReturnsSequentially_With_Out_Span() { - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse(Any()) .ReturnsSequentially(true, true, false) .SetsOutData(new ReadOnlySpan([0x01, 0x02])); @@ -1103,7 +1103,7 @@ public async Task ReturnsSequentially_With_Out_Span() public async Task Separate_Setups_For_Different_Span_Data() { // Use separate setups per input value instead of Then() for different span data - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse("first") .Returns(true) .SetsOutData(new ReadOnlySpan([0x01])); @@ -1139,7 +1139,7 @@ public class ReadOnlySpanByteOutComprehensiveTests public async Task Callback_With_Void_Out_Span_Method() { var wasCalled = false; - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Do() .Callback(() => wasCalled = true) .SetsOutBuffer(new ReadOnlySpan([0xFF])); @@ -1154,7 +1154,7 @@ public async Task Callback_With_Void_Out_Span_Method() [Test] public async Task Throws_With_Void_Out_Span_Method() { - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Do().Throws(); var ex = Assert.Throws(() => @@ -1166,7 +1166,7 @@ public async Task Throws_With_Void_Out_Span_Method() [Test] public async Task Throws_Instance_With_Out_Span() { - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Do().Throws(new InvalidOperationException("custom message")); var ex = Assert.Throws(() => @@ -1179,7 +1179,7 @@ public async Task Throws_Instance_With_Out_Span() [Test] public async Task Verification_Once() { - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Object.Do(out _); mock.Do().WasCalled(Times.Once); @@ -1189,7 +1189,7 @@ public async Task Verification_Once() [Test] public async Task Verification_Multiple() { - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Object.Do(out _); mock.Object.Do(out _); mock.Object.Do(out _); @@ -1204,7 +1204,7 @@ public async Task Verification_Multiple() [Test] public async Task Verification_Never() { - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Do().WasNeverCalled(); mock.Do().WasCalled(Times.Never); @@ -1218,7 +1218,7 @@ public async Task Out_Span_Large_Data() for (int i = 0; i < largeData.Length; i++) largeData[i] = (byte)(i % 256); - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Do().SetsOutBuffer(new ReadOnlySpan(largeData)); mock.Object.Do(out var buffer); @@ -1234,7 +1234,7 @@ public async Task Out_Span_Large_Data() [Test] public async Task Out_Span_Chaining_Returns_Then_SetsOut() { - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse("a") .Returns(true) .SetsOutData(new ReadOnlySpan([1])); @@ -1249,7 +1249,7 @@ public async Task Out_Span_Chaining_Returns_Then_SetsOut() [Test] public async Task Out_Span_Chaining_SetsOut_Then_Returns() { - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse("b") .SetsOutData(new ReadOnlySpan([2, 3])) .Returns(true); @@ -1264,7 +1264,7 @@ public async Task Out_Span_Chaining_SetsOut_Then_Returns() [Test] public async Task Out_Span_Typed_SetsOutData_With_Array() { - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse("key") .Returns(true) .SetsOutData(new ReadOnlySpan([0xDE, 0xAD])); @@ -1281,7 +1281,7 @@ public async Task Out_Span_Typed_SetsOutData_With_Array() [Test] public async Task Out_Span_Different_Values_Per_Input() { - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse("alpha") .Returns(true) .SetsOutData(new ReadOnlySpan([0x01])); @@ -1322,7 +1322,7 @@ public async Task Out_Span_Different_Values_Per_Input() [Test] public async Task Out_Span_Verification_With_Mixed_Params() { - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse(Any()).Returns(false); mock.Object.TryParse("x", out _); @@ -1340,7 +1340,7 @@ public async Task Out_Span_Verification_With_Mixed_Params() public async Task Out_Span_Callback_With_Args() { string? capturedInput = null; - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse(Any()) .Callback((string input) => capturedInput = input) .Returns(true) @@ -1354,7 +1354,7 @@ public async Task Out_Span_Callback_With_Args() [Test] public async Task Out_Span_Throws_Exception_Factory() { - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse(Any()) .Throws((string input) => new ArgumentException($"Bad input: {input}")); diff --git a/TUnit.Mocks.Tests/CustomDelegateEventTests.cs b/TUnit.Mocks.Tests/CustomDelegateEventTests.cs index e2d9377d05..48ec427d4d 100644 --- a/TUnit.Mocks.Tests/CustomDelegateEventTests.cs +++ b/TUnit.Mocks.Tests/CustomDelegateEventTests.cs @@ -20,7 +20,7 @@ public class CustomDelegateEventTests public async Task Raise_Action_Event() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); var wasCalled = false; mock.Object.OnSimpleAction += () => wasCalled = true; @@ -36,7 +36,7 @@ public async Task Raise_Action_Event() public async Task Raise_Action_String_Event() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); string? receivedValue = null; mock.Object.OnStringAction += value => receivedValue = value; @@ -52,7 +52,7 @@ public async Task Raise_Action_String_Event() public async Task Raise_MultiParam_Action_Event() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); string? receivedName = null; int receivedAge = 0; @@ -74,7 +74,7 @@ public async Task Raise_MultiParam_Action_Event() public async Task Raise_Standard_EventHandler_Still_Works() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); string? receivedValue = null; mock.Object.OnStandardEvent += (sender, e) => receivedValue = e; @@ -90,7 +90,7 @@ public async Task Raise_Standard_EventHandler_Still_Works() public async Task Multiple_Subscribers_All_Notified() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); var results = new List(); mock.Object.OnStringAction += val => results.Add("sub1:" + val); @@ -109,7 +109,7 @@ public async Task Multiple_Subscribers_All_Notified() public async Task Unsubscribe_Stops_Notifications() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); var callCount = 0; Action handler = _ => callCount++; @@ -128,7 +128,7 @@ public async Task Unsubscribe_Stops_Notifications() public async Task No_Subscribers_Does_Not_Throw() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); // Act & Assert — should not throw mock.RaiseOnSimpleAction(); diff --git a/TUnit.Mocks.Tests/CustomMatcherTests.cs b/TUnit.Mocks.Tests/CustomMatcherTests.cs index 7793453b72..b4a45aa982 100644 --- a/TUnit.Mocks.Tests/CustomMatcherTests.cs +++ b/TUnit.Mocks.Tests/CustomMatcherTests.cs @@ -54,7 +54,7 @@ public class CustomMatcherTests public async Task Custom_String_Length_Matcher() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Matches(new StringLengthMatcher(3, 10))).Returns("valid"); // Act @@ -71,7 +71,7 @@ public async Task Custom_String_Length_Matcher() public async Task Custom_Range_Matcher_With_Calculator() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Matches(new RangeMatcher(1, 10)), Any()).Returns(100); // Act @@ -89,7 +89,7 @@ public async Task Custom_Range_Matcher_With_Calculator() public async Task Custom_Matcher_With_Predicate_Combined() { // Arrange — custom matcher for first arg, predicate for second - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Matches(new RangeMatcher(0, 100)), Is(b => b > 0)).Returns(42); // Act @@ -116,7 +116,7 @@ public async Task Custom_Matcher_Describe_Used_In_Error() public async Task Custom_Matcher_With_Verification() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(0); // Act diff --git a/TUnit.Mocks.Tests/DefaultValueProviderTests.cs b/TUnit.Mocks.Tests/DefaultValueProviderTests.cs index fe16f34702..8f703158f7 100644 --- a/TUnit.Mocks.Tests/DefaultValueProviderTests.cs +++ b/TUnit.Mocks.Tests/DefaultValueProviderTests.cs @@ -27,7 +27,7 @@ public bool CanProvide(Type type) public async Task Custom_Provider_Returns_String_Default() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.DefaultValueProvider = new CustomProvider(); IGreeter greeter = mock.Object; @@ -43,7 +43,7 @@ public async Task Custom_Provider_Returns_String_Default() public async Task Custom_Provider_Returns_Int_Default() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.DefaultValueProvider = new CustomProvider(); ICalculator calc = mock.Object; @@ -59,7 +59,7 @@ public async Task Custom_Provider_Returns_Int_Default() public async Task Setup_Takes_Precedence_Over_Provider() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.DefaultValueProvider = new CustomProvider(); mock.Add(1, 2).Returns(100); @@ -91,7 +91,7 @@ public async Task Factory_Method_Creates_Mock_With_Provider() public async Task BuiltIn_Provider_Returns_Empty_String() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.DefaultValueProvider = DefaultValueProvider.Instance; IGreeter greeter = mock.Object; @@ -107,7 +107,7 @@ public async Task BuiltIn_Provider_Returns_Empty_String() public async Task No_Provider_Uses_Smart_Default_For_String() { // Arrange — no provider set, source generator provides "" as smart default - var mock = Mock.Of(); + var mock = IGreeter.Mock(); IGreeter greeter = mock.Object; diff --git a/TUnit.Mocks.Tests/DiagnosticsTests.cs b/TUnit.Mocks.Tests/DiagnosticsTests.cs index 8cf0715624..d35f187094 100644 --- a/TUnit.Mocks.Tests/DiagnosticsTests.cs +++ b/TUnit.Mocks.Tests/DiagnosticsTests.cs @@ -7,7 +7,7 @@ public class DiagnosticsTests [Test] public async Task Unused_Setups_Detected() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Configure two setups but only exercise one mock.Add(1, 2).Returns(3); @@ -27,7 +27,7 @@ public async Task Unused_Setups_Detected() [Test] public async Task Unmatched_Calls_Detected() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Configure setup only for specific args mock.Add(1, 2).Returns(3); @@ -45,7 +45,7 @@ public async Task Unmatched_Calls_Detected() [Test] public async Task All_Setups_Exercised() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); @@ -62,7 +62,7 @@ public async Task All_Setups_Exercised() [Test] public async Task No_Calls_Means_All_Setups_Unused() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); mock.Add(3, 4).Returns(7); @@ -77,7 +77,7 @@ public async Task No_Calls_Means_All_Setups_Unused() [Test] public async Task Matcher_Descriptions_Populated() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Is(x => x > 0)).Returns(1); var diag = mock.GetDiagnostics(); @@ -92,7 +92,7 @@ public async Task Matcher_Descriptions_Populated() [Test] public async Task Reset_Clears_Diagnostics() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); ICalculator calc = mock.Object; @@ -111,7 +111,7 @@ public async Task Reset_Clears_Diagnostics() [Test] public async Task Empty_Mock_Has_Clean_Diagnostics() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); var diag = mock.GetDiagnostics(); diff --git a/TUnit.Mocks.Tests/EdgeCaseTests.cs b/TUnit.Mocks.Tests/EdgeCaseTests.cs index 3c89530aab..7edb5b364e 100644 --- a/TUnit.Mocks.Tests/EdgeCaseTests.cs +++ b/TUnit.Mocks.Tests/EdgeCaseTests.cs @@ -130,7 +130,7 @@ public class OverloadEdgeCaseTests public async Task Overload_Int_Vs_String_Different_Setups() { // Arrange - var mock = Mock.Of(); + var mock = IOverloadedService.Mock(); mock.Format(42).Returns("int:42"); mock.Format("hello").Returns("str:hello"); @@ -148,7 +148,7 @@ public async Task Overload_Int_Vs_String_Different_Setups() public async Task Overload_Two_Params_Different_Signatures() { // Arrange - var mock = Mock.Of(); + var mock = IOverloadedService.Mock(); mock.Format(10, "PREFIX").Returns("int-string:PREFIX10"); mock.Format(3.14, 2).Returns("double-int:3.14:2"); @@ -168,7 +168,7 @@ public async Task Overload_Void_With_Optional_Bool() // Arrange var singleArgCalled = false; var twoArgCalled = false; - var mock = Mock.Of(); + var mock = IOverloadedService.Mock(); mock.Process(Any()) .Callback(() => singleArgCalled = true); mock.Process(Any(), Any()) @@ -188,7 +188,7 @@ public async Task Overload_Void_With_Optional_Bool() public async Task Overload_Verify_Specific_Overload() { // Arrange - var mock = Mock.Of(); + var mock = IOverloadedService.Mock(); mock.Format(Any()).Returns("int"); mock.Format(Any()).Returns("string"); @@ -214,7 +214,7 @@ public class LargeParameterCountTests public async Task Seven_Parameter_Method_With_Mixed_Matchers() { // Arrange - var mock = Mock.Of(); + var mock = IComplexOperations.Mock(); mock.BuildQuery( "users", Any(), @@ -257,7 +257,7 @@ public async Task Seven_Parameter_Method_With_Mixed_Matchers() public async Task Payment_Method_With_CancellationToken_And_Nullable() { // Arrange - var mock = Mock.Of(); + var mock = IComplexOperations.Mock(); mock.ProcessPaymentAsync( "merchant-123", Is(a => a > 0), @@ -304,7 +304,7 @@ public class InterfaceInheritanceTests public async Task Deep_Interface_Inheritance_All_Properties_Accessible() { // Arrange - var mock = Mock.Of(); + var mock = ISoftDeletable.Mock(); var now = DateTime.UtcNow; // Setup properties from all three levels of inheritance @@ -338,12 +338,12 @@ public async Task Deep_Interface_Inheritance_All_Properties_Accessible() public async Task Repository_Returning_Inherited_Interface() { // Arrange — create a mock ISoftDeletable to use as the return value - var entityMock = Mock.Of(); + var entityMock = ISoftDeletable.Mock(); entityMock.Id.Returns(1); entityMock.CreatedBy.Returns("system"); entityMock.IsDeleted.Returns(false); - var repoMock = Mock.Of(); + var repoMock = IAuditRepository.Mock(); repoMock.GetByIdAsync(1).Returns(entityMock.Object); var activeList = new List { entityMock.Object }; @@ -375,7 +375,7 @@ public class ExceptionEdgeCaseTests public async Task Throws_Specific_Exception_With_Message() { // Arrange - var mock = Mock.Of(); + var mock = IExternalApi.Mock(); mock.GetConfig("missing-key").Throws(); // Act & Assert @@ -392,7 +392,7 @@ public async Task Throws_Specific_Exception_With_Message() public async Task Sequential_Throws_Then_Succeeds() { // Arrange — simulate a retry pattern: first call fails, second succeeds - var mock = Mock.Of(); + var mock = IExternalApi.Mock(); mock.CallRemoteServiceAsync("https://api.example.com/data") .Throws() .Then() @@ -424,7 +424,7 @@ public async Task Sequential_Throws_Then_Succeeds() public async Task Async_Throws_Returns_Faulted_Task_Not_Sync_Throw() { // Arrange - var mock = Mock.Of(); + var mock = IExternalApi.Mock(); mock.CallRemoteServiceAsync(Any()).Throws(); // Act — the method should return a faulted task, NOT throw synchronously @@ -449,7 +449,7 @@ public async Task Async_Throws_Returns_Faulted_Task_Not_Sync_Throw() public async Task Different_Args_Different_Exceptions() { // Arrange - var mock = Mock.Of(); + var mock = IExternalApi.Mock(); mock.GetConfig("arg-error").Throws(); mock.GetConfig("timeout").Throws(); mock.GetConfig("valid").Returns("value"); @@ -478,7 +478,7 @@ public class ComplexArgumentMatchingTests public async Task Predicate_Matcher_String_Length_Range() { // Arrange - var mock = Mock.Of(); + var mock = IValidator.Mock(); mock.Validate(Is(s => s != null && s.Length >= 3 && s.Length <= 50)).Returns(true); // Act @@ -499,7 +499,7 @@ public async Task Predicate_Matcher_String_Length_Range() public async Task Multiple_Predicates_On_Multiple_Args() { // Arrange - var mock = Mock.Of(); + var mock = IValidator.Mock(); mock.Score( Is(t => t != null && t.Length > 0), Is(w => w >= 1 && w <= 10) @@ -523,7 +523,7 @@ public async Task Multiple_Predicates_On_Multiple_Args() public async Task Exact_Match_Overrides_Any_Match_Later_Wins() { // Arrange — setup Any first, then exact. Last setup wins for matching args. - var mock = Mock.Of(); + var mock = IValidator.Mock(); mock.Validate(Any()).Returns(false); mock.Validate("special").Returns(true); @@ -541,7 +541,7 @@ public async Task Arg_Capture_Across_Multiple_Calls_Verifies_All() { // Arrange var input = Any(); - var mock = Mock.Of(); + var mock = IValidator.Mock(); mock.Validate(input).Returns(true); // Act — 5 calls with different arguments @@ -572,7 +572,7 @@ public class ResetReconfigurationTests public async Task Reset_Then_Reconfigure_Different_Behavior() { // Arrange - var mock = Mock.Of(); + var mock = IExternalApi.Mock(); mock.GetConfig("key").Returns("A"); IExternalApi api = mock.Object; @@ -596,7 +596,7 @@ public async Task Reset_Then_Reconfigure_Different_Behavior() public async Task Reset_Mid_Test_Changes_Verification_Baseline() { // Arrange - var mock = Mock.Of(); + var mock = IExternalApi.Mock(); IExternalApi api = mock.Object; // Act — make calls before reset @@ -634,7 +634,7 @@ public class ConcurrentAccessTests public async Task Concurrent_Setup_And_Invocation_From_Multiple_Threads() { // Arrange - var mock = Mock.Of(); + var mock = IConcurrentService.Mock(); mock.GetValue(Any()).Returns(42); IConcurrentService svc = mock.Object; @@ -662,7 +662,7 @@ public async Task Concurrent_Setup_And_Invocation_From_Multiple_Threads() public async Task Concurrent_Verification_After_Parallel_Calls() { // Arrange - var mock = Mock.Of(); + var mock = IConcurrentService.Mock(); mock.IncrementAsync(Any()).Returns(1); IConcurrentService svc = mock.Object; @@ -686,7 +686,7 @@ public class EnumParameterTests public async Task Enum_Parameter_Exact_Match() { // Arrange - var mock = Mock.Of(); + var mock = ITaskManager.Mock(); var lowItems = new List { @@ -718,7 +718,7 @@ public async Task Enum_Parameter_Exact_Match() public async Task Enum_Parameter_With_Predicate_Matcher() { // Arrange - var mock = Mock.Of(); + var mock = ITaskManager.Mock(); mock.CountByStatusAsync(Is(s => s == Status.Active || s == Status.Pending)).Returns(10); mock.CountByStatusAsync(Is(s => s == Status.Completed || s == Status.Failed)).Returns(5); @@ -738,7 +738,7 @@ public async Task Enum_Parameter_With_Predicate_Matcher() public async Task Enum_Void_Method_Verify_Specific_Value() { // Arrange - var mock = Mock.Of(); + var mock = ITaskManager.Mock(); ITaskManager mgr = mock.Object; // Act diff --git a/TUnit.Mocks.Tests/ErrorMessageTests.cs b/TUnit.Mocks.Tests/ErrorMessageTests.cs index f8de6f9bd3..7a4626319a 100644 --- a/TUnit.Mocks.Tests/ErrorMessageTests.cs +++ b/TUnit.Mocks.Tests/ErrorMessageTests.cs @@ -16,7 +16,7 @@ public class ErrorMessageTests public async Task Verification_Message_Contains_Expected_Call_Description() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act & Assert — verify a call that was never made var exception = Assert.Throws(() => @@ -32,7 +32,7 @@ public async Task Verification_Message_Contains_Expected_Call_Description() public async Task Verification_Message_Contains_Actual_Count() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); calc.Add(1, 2); @@ -52,7 +52,7 @@ public async Task Verification_Message_Contains_Actual_Count() public async Task Verification_Message_Contains_Formatted_Argument_Values() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(42, 99); @@ -71,7 +71,7 @@ public async Task Verification_Message_Contains_Formatted_Argument_Values() public async Task Verification_Message_Contains_String_Arguments() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); IGreeter greeter = mock.Object; greeter.Greet("Alice"); @@ -89,7 +89,7 @@ public async Task Verification_Message_Contains_String_Arguments() public async Task Verification_Message_Contains_Expected_Times_Description() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act & Assert var exception = Assert.Throws(() => @@ -106,7 +106,7 @@ public async Task Verification_Message_Contains_Expected_Times_Description() public async Task Verification_WasNeverCalled_Message_Shows_Actual_Count() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); calc.Add(1, 2); @@ -124,7 +124,7 @@ public async Task Verification_WasNeverCalled_Message_Shows_Actual_Count() public async Task Verification_AtLeast_Message_Shows_Shortfall() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); @@ -142,7 +142,7 @@ public async Task Verification_AtLeast_Message_Shows_Shortfall() public async Task Verification_Actual_Calls_List_Is_Populated() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(10, 20); calc.Add(30, 40); @@ -163,7 +163,7 @@ public async Task Verification_Actual_Calls_List_Is_Populated() public async Task Strict_Message_Contains_Method_Name() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert @@ -180,7 +180,7 @@ public async Task Strict_Message_Contains_Method_Name() public async Task Strict_Message_Contains_Int_Arguments() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert @@ -199,7 +199,7 @@ public async Task Strict_Message_Contains_Int_Arguments() public async Task Strict_Message_Contains_String_Arguments() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = IGreeter.Mock(MockBehavior.Strict); IGreeter greeter = mock.Object; // Act & Assert @@ -218,7 +218,7 @@ public async Task Strict_Message_Contains_String_Arguments() public async Task Strict_Message_Contains_Violation_Description() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert @@ -235,7 +235,7 @@ public async Task Strict_Message_Contains_Violation_Description() public async Task Strict_Void_Method_Message_Contains_Method_Name_And_Args() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert diff --git a/TUnit.Mocks.Tests/EventSubscriptionSetupTests.cs b/TUnit.Mocks.Tests/EventSubscriptionSetupTests.cs index 3f2c6835d6..5ac8a958c3 100644 --- a/TUnit.Mocks.Tests/EventSubscriptionSetupTests.cs +++ b/TUnit.Mocks.Tests/EventSubscriptionSetupTests.cs @@ -10,7 +10,7 @@ public class EventSubscriptionSetupTests [Test] public async Task OnSubscribe_Callback_Fires_When_Handler_Subscribes() { - var mock = Mock.Of(); + var mock = INotifyService.Mock(); var callbackFired = false; mock.Events.DataReady.OnSubscribe(() => callbackFired = true); @@ -23,7 +23,7 @@ public async Task OnSubscribe_Callback_Fires_When_Handler_Subscribes() [Test] public async Task OnUnsubscribe_Callback_Fires_When_Handler_Unsubscribes() { - var mock = Mock.Of(); + var mock = INotifyService.Mock(); var callbackFired = false; mock.Events.DataReady.OnUnsubscribe(() => callbackFired = true); @@ -38,7 +38,7 @@ public async Task OnUnsubscribe_Callback_Fires_When_Handler_Unsubscribes() [Test] public async Task Multiple_Subscriptions_Fire_Callback_Each_Time() { - var mock = Mock.Of(); + var mock = INotifyService.Mock(); var callCount = 0; mock.Events.DataReady.OnSubscribe(() => callCount++); @@ -53,7 +53,7 @@ public async Task Multiple_Subscriptions_Fire_Callback_Each_Time() [Test] public async Task No_Callback_Fires_When_None_Configured() { - var mock = Mock.Of(); + var mock = INotifyService.Mock(); // Subscribe without configuring any callback — should not throw mock.Object.DataReady += (sender, args) => { }; @@ -64,7 +64,7 @@ public async Task No_Callback_Fires_When_None_Configured() [Test] public async Task Subscribe_And_Unsubscribe_Callbacks_Work_Independently() { - var mock = Mock.Of(); + var mock = INotifyService.Mock(); var subscribeCount = 0; var unsubscribeCount = 0; @@ -83,7 +83,7 @@ public async Task Subscribe_And_Unsubscribe_Callbacks_Work_Independently() [Test] public async Task Reset_Clears_Subscription_Callbacks() { - var mock = Mock.Of(); + var mock = INotifyService.Mock(); var callbackFired = false; mock.Events.DataReady.OnSubscribe(() => callbackFired = true); diff --git a/TUnit.Mocks.Tests/EventSubscriptionVerifyTests.cs b/TUnit.Mocks.Tests/EventSubscriptionVerifyTests.cs index 3ff007ccb7..40b02e20e8 100644 --- a/TUnit.Mocks.Tests/EventSubscriptionVerifyTests.cs +++ b/TUnit.Mocks.Tests/EventSubscriptionVerifyTests.cs @@ -9,7 +9,7 @@ public class EventSubscriptionVerifyTests public async Task WasEventSubscribed_Returns_True_After_Subscribe() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); // Act mock.Object.OnStringAction += _ => { }; @@ -22,7 +22,7 @@ public async Task WasEventSubscribed_Returns_True_After_Subscribe() public async Task WasEventSubscribed_Returns_False_When_No_Subscription() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); // Assert await Assert.That(mock.Events.OnStringAction.WasSubscribed).IsFalse(); @@ -32,7 +32,7 @@ public async Task WasEventSubscribed_Returns_False_When_No_Subscription() public async Task GetEventSubscriberCount_Tracks_Subscriptions() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); // Act mock.Object.OnStringAction += _ => { }; @@ -46,7 +46,7 @@ public async Task GetEventSubscriberCount_Tracks_Subscriptions() public async Task GetEventSubscriberCount_Decrements_On_Unsubscribe() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); Action handler = _ => { }; // Act @@ -62,7 +62,7 @@ public async Task GetEventSubscriberCount_Decrements_On_Unsubscribe() public async Task Different_Events_Tracked_Independently() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); // Act mock.Object.OnStringAction += _ => { }; @@ -79,7 +79,7 @@ public async Task Different_Events_Tracked_Independently() public async Task Reset_Clears_Subscription_History() { // Arrange - var mock = Mock.Of(); + var mock = ICustomEventService.Mock(); mock.Object.OnStringAction += _ => { }; // Act diff --git a/TUnit.Mocks.Tests/EventTests.cs b/TUnit.Mocks.Tests/EventTests.cs index 288a9eefd9..d52cd75ed9 100644 --- a/TUnit.Mocks.Tests/EventTests.cs +++ b/TUnit.Mocks.Tests/EventTests.cs @@ -29,7 +29,7 @@ public class EventTests public async Task Raise_Event_Notifies_Subscriber() { // Arrange - var mock = Mock.Of(); + var mock = IEventService.Mock(); string? receivedMessage = null; IEventService svc = mock.Object; @@ -46,7 +46,7 @@ public async Task Raise_Event_Notifies_Subscriber() public async Task Raise_Event_Notifies_Multiple_Subscribers() { // Arrange - var mock = Mock.Of(); + var mock = IEventService.Mock(); var messages = new List(); IEventService svc = mock.Object; @@ -66,7 +66,7 @@ public async Task Raise_Event_Notifies_Multiple_Subscribers() public async Task Raise_Event_With_No_Subscribers_Does_Not_Throw() { // Arrange - var mock = Mock.Of(); + var mock = IEventService.Mock(); // Act & Assert — should not throw when no subscribers mock.RaiseOnMessage("nobody listening"); @@ -77,7 +77,7 @@ public async Task Raise_Event_With_No_Subscribers_Does_Not_Throw() public async Task Unsubscribe_From_Event_Stops_Notifications() { // Arrange - var mock = Mock.Of(); + var mock = IEventService.Mock(); var callCount = 0; IEventService svc = mock.Object; @@ -101,7 +101,7 @@ public async Task Unsubscribe_From_Event_Stops_Notifications() [Test] public async Task Mock_With_Multiple_Multi_Parameter_Events_Compiles_And_Raises() { - var mock = Mock.Of(); + var mock = IMultiEventNotifier.Mock(); var notifier = mock.Object; string? changingProperty = null; diff --git a/TUnit.Mocks.Tests/FuncOverloadTests.cs b/TUnit.Mocks.Tests/FuncOverloadTests.cs index 42355433dd..b5df74849e 100644 --- a/TUnit.Mocks.Tests/FuncOverloadTests.cs +++ b/TUnit.Mocks.Tests/FuncOverloadTests.cs @@ -22,7 +22,7 @@ public class FuncOverloadTests public async Task Single_Param_Lambda_Setup_And_Match() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(s => s.StartsWith("Hi")).Returns("matched"); // Act @@ -36,7 +36,7 @@ public async Task Single_Param_Lambda_Setup_And_Match() public async Task Single_Param_Lambda_No_Match_Returns_Default() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(s => s.StartsWith("Hi")).Returns("matched"); // Act @@ -50,7 +50,7 @@ public async Task Single_Param_Lambda_No_Match_Returns_Default() public async Task Mixed_Lambda_And_Any() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(x => x > 5, Any()).Returns(100); // Act @@ -64,7 +64,7 @@ public async Task Mixed_Lambda_And_Any() public async Task Mixed_Lambda_And_Any_No_Match() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(x => x > 5, Any()).Returns(100); // Act @@ -78,7 +78,7 @@ public async Task Mixed_Lambda_And_Any_No_Match() public async Task Mixed_Any_And_Lambda() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), y => y % 2 == 0).Returns(42); // Act @@ -94,7 +94,7 @@ public async Task Mixed_Any_And_Lambda() public async Task Both_Params_Lambda() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(x => x > 0, y => y > 0).Returns(99); // Act @@ -110,7 +110,7 @@ public async Task Both_Params_Lambda() public async Task Mixed_Lambda_And_Value() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(x => x > 5, 3).Returns(50); // Act @@ -126,7 +126,7 @@ public async Task Mixed_Lambda_And_Value() public async Task Lambda_Verification_WasCalled() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act mock.Object.Add(10, 20); @@ -139,7 +139,7 @@ public async Task Lambda_Verification_WasCalled() public async Task Lambda_Verification_WasNeverCalled() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act mock.Object.Add(10, 20); @@ -152,7 +152,7 @@ public async Task Lambda_Verification_WasNeverCalled() public async Task Void_Method_Lambda() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); var logged = false; mock.Log(s => s.Contains("error")).Callback(() => logged = true); @@ -167,7 +167,7 @@ public async Task Void_Method_Lambda() public async Task Async_Method_Lambda() { // Arrange - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetNameAsync(s => s.Length > 3).Returns("found"); // Act @@ -181,7 +181,7 @@ public async Task Async_Method_Lambda() public async Task String_Predicate_Lambda() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(name => name.Contains("World")).Returns("Hello World!"); // Act @@ -200,7 +200,7 @@ public async Task Func_Typed_Parameter_No_Ambiguity() // The base overload is Arg> and the generated Func overload // is Func, bool>. Passing a Func value should // target the base overload (implicit T -> Arg), not cause ambiguity. - var mock = Mock.Of(); + var mock = IFilterService.Mock(); Func isPositive = x => x > 0; mock.Apply(isPositive).Returns(42); @@ -215,7 +215,7 @@ public async Task Func_Typed_Parameter_No_Ambiguity() public async Task Multiple_Lambda_Setups_Last_Wins() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(x => x > 0, Any()).Returns(50); mock.Add(x => x > 10, Any()).Returns(100); diff --git a/TUnit.Mocks.Tests/GenericConstraintTests.cs b/TUnit.Mocks.Tests/GenericConstraintTests.cs index 1ae46a006d..a2987edd51 100644 --- a/TUnit.Mocks.Tests/GenericConstraintTests.cs +++ b/TUnit.Mocks.Tests/GenericConstraintTests.cs @@ -32,7 +32,7 @@ public class GenericConstraintTests [Test] public async Task Notnull_Constraint_Mock_Returns_Configured_Value() { - var mock = Mock.Of(); + var mock = INotnullService.Mock(); mock.Get("key").Returns(42); INotnullService svc = mock.Object; @@ -44,7 +44,7 @@ public async Task Notnull_Constraint_Mock_Returns_Configured_Value() [Test] public void New_Constraint_Mock_Does_Not_Throw() { - var mock = Mock.Of(); + var mock = INewConstraintService.Mock(); INewConstraintService svc = mock.Object; _ = svc.Create(); @@ -53,7 +53,7 @@ public void New_Constraint_Mock_Does_Not_Throw() [Test] public void Base_Type_Constraint_Mock_Does_Not_Throw() { - var mock = Mock.Of(); + var mock = IBaseTypeConstraintService.Mock(); IBaseTypeConstraintService svc = mock.Object; _ = svc.Get(); @@ -62,7 +62,7 @@ public void Base_Type_Constraint_Mock_Does_Not_Throw() [Test] public void Composite_Class_Constraint_Mock_Does_Not_Throw() { - var mock = Mock.Of(); + var mock = ICompositeConstraintService.Mock(); ICompositeConstraintService svc = mock.Object; _ = svc.Create(); @@ -71,7 +71,7 @@ public void Composite_Class_Constraint_Mock_Does_Not_Throw() [Test] public async Task Composite_Struct_Constraint_Mock_Returns_Default() { - var mock = Mock.Of(); + var mock = ICompositeConstraintService.Mock(); ICompositeConstraintService svc = mock.Object; var result = svc.Read(); diff --git a/TUnit.Mocks.Tests/GenericInterfaceTypeArgumentTests.cs b/TUnit.Mocks.Tests/GenericInterfaceTypeArgumentTests.cs index b7bc054bb5..9e60c3bc77 100644 --- a/TUnit.Mocks.Tests/GenericInterfaceTypeArgumentTests.cs +++ b/TUnit.Mocks.Tests/GenericInterfaceTypeArgumentTests.cs @@ -43,7 +43,7 @@ public interface IProvider [Test] public async Task Generic_Interface_With_Enum_Type_Argument() { - var mock = Mock.Of>(); + var mock = IValueHolder.Mock(); mock.Value.Returns(Priority.High); IValueHolder holder = mock.Object; @@ -67,7 +67,7 @@ public async Task Generic_Interface_With_Enum_Via_Static_Extension() [Test] public async Task Generic_Interface_With_Class_Type_Argument() { - var mock = Mock.Of>(); + var mock = IValueHolder.Mock(); var config = new ItemConfig { Name = "Test", Value = 42 }; mock.Value.Returns(config); @@ -95,7 +95,7 @@ public async Task Generic_Interface_With_Class_Via_Static_Extension() [Test] public async Task Generic_Interface_With_Two_Non_Builtin_Type_Arguments() { - var mock = Mock.Of>(); + var mock = IMapper.Mock(); mock.Map(Any()).Returns(Priority.High); IMapper mapper = mock.Object; @@ -107,7 +107,7 @@ public async Task Generic_Interface_With_Two_Non_Builtin_Type_Arguments() [Test] public async Task Generic_Interface_With_Nested_Generic_Type_Argument() { - var mock = Mock.Of>>(); + var mock = IProvider>.Mock(); var items = new List { new() { Name = "A", Value = 1 } }; mock.Get().Returns(items); @@ -121,7 +121,7 @@ public async Task Generic_Interface_With_Nested_Generic_Type_Argument() [Test] public void Generic_Interface_With_Enum_Void_Method_Does_Not_Throw() { - var mock = Mock.Of>(); + var mock = IValueHolder.Mock(); IValueHolder holder = mock.Object; holder.SetValue(Priority.Low); @@ -130,7 +130,7 @@ public void Generic_Interface_With_Enum_Void_Method_Does_Not_Throw() [Test] public void Generic_Interface_With_Enum_Verify_Calls() { - var mock = Mock.Of>(); + var mock = IValueHolder.Mock(); IValueHolder holder = mock.Object; holder.SetValue(Priority.High); diff --git a/TUnit.Mocks.Tests/GenericTests.cs b/TUnit.Mocks.Tests/GenericTests.cs index a7484ba373..48a9708f56 100644 --- a/TUnit.Mocks.Tests/GenericTests.cs +++ b/TUnit.Mocks.Tests/GenericTests.cs @@ -33,7 +33,7 @@ public class GenericTests public async Task Generic_Method_Returns_Configured_Value() { // Arrange - var mock = Mock.Of(); + var mock = IRepository.Mock(); var customer = new Customer { Id = 1, Name = "Alice" }; mock.Get(1).Returns(customer); @@ -50,7 +50,7 @@ public async Task Generic_Method_Returns_Configured_Value() public async Task Generic_Method_Unconfigured_Returns_Default() { // Arrange - var mock = Mock.Of(); + var mock = IRepository.Mock(); // Act IRepository repo = mock.Object; @@ -64,7 +64,7 @@ public async Task Generic_Method_Unconfigured_Returns_Default() public async Task Generic_Method_Different_Type_Arguments() { // Arrange - var mock = Mock.Of(); + var mock = IRepository.Mock(); var customer = new Customer { Id = 1, Name = "Alice" }; var order = new Order { OrderId = 42 }; @@ -87,7 +87,7 @@ public async Task Generic_Method_Different_Type_Arguments() public void Generic_Void_Method_Does_Not_Throw() { // Arrange - var mock = Mock.Of(); + var mock = IRepository.Mock(); var customer = new Customer { Id = 1, Name = "Bob" }; // Act & Assert - should not throw in loose mode @@ -99,7 +99,7 @@ public void Generic_Void_Method_Does_Not_Throw() public async Task Generic_Void_Method_Verify() { // Arrange - var mock = Mock.Of(); + var mock = IRepository.Mock(); var customer = new Customer { Id = 1, Name = "Charlie" }; // Act @@ -115,7 +115,7 @@ public async Task Generic_Void_Method_Verify() public async Task Generic_Method_With_Any_Matcher() { // Arrange - var mock = Mock.Of(); + var mock = IRepository.Mock(); var customer = new Customer { Id = 1, Name = "Any" }; mock.Get(Any()).Returns(customer); @@ -133,7 +133,7 @@ public async Task Generic_Method_With_Any_Matcher() public async Task Generic_Method_With_Two_Type_Parameters() { // Arrange - var mock = Mock.Of(); + var mock = IRepository.Mock(); var order = new Order { OrderId = 10 }; mock.Transform(Any()).Returns(order); diff --git a/TUnit.Mocks.Tests/ImplicitArgConversionTests.cs b/TUnit.Mocks.Tests/ImplicitArgConversionTests.cs index b4d6b9d5d1..f3e3ffc9c0 100644 --- a/TUnit.Mocks.Tests/ImplicitArgConversionTests.cs +++ b/TUnit.Mocks.Tests/ImplicitArgConversionTests.cs @@ -16,7 +16,7 @@ public class ImplicitArgConversionTests [Test] public async Task Implicit_Value_Int_Matches_Exact() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(2, 3).Returns(5); await Assert.That(mock.Object.Add(2, 3)).IsEqualTo(5); @@ -25,7 +25,7 @@ public async Task Implicit_Value_Int_Matches_Exact() [Test] public async Task Implicit_Value_Int_Does_Not_Match_Different_Value() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(2, 3).Returns(5); await Assert.That(mock.Object.Add(2, 4)).IsEqualTo(0); @@ -35,7 +35,7 @@ public async Task Implicit_Value_Int_Does_Not_Match_Different_Value() [Test] public async Task Implicit_Value_String_Matches_Exact() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet("Alice").Returns("Hello, Alice!"); await Assert.That(mock.Object.Greet("Alice")).IsEqualTo("Hello, Alice!"); @@ -44,7 +44,7 @@ public async Task Implicit_Value_String_Matches_Exact() [Test] public async Task Implicit_Value_String_Does_Not_Match_Different_Value() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet("Alice").Returns("Hello, Alice!"); await Assert.That(mock.Object.Greet("Bob")).IsNotEqualTo("Hello, Alice!"); @@ -55,7 +55,7 @@ public async Task Implicit_Value_String_Does_Not_Match_Different_Value() [Test] public async Task Implicit_Value_Zero_Matches() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(0, 0).Returns(99); await Assert.That(mock.Object.Add(0, 0)).IsEqualTo(99); @@ -64,7 +64,7 @@ public async Task Implicit_Value_Zero_Matches() [Test] public async Task Implicit_Value_Negative_Numbers_Match() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(-1, -2).Returns(-3); await Assert.That(mock.Object.Add(-1, -2)).IsEqualTo(-3); @@ -74,7 +74,7 @@ public async Task Implicit_Value_Negative_Numbers_Match() [Test] public async Task Implicit_Value_Empty_String_Matches() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet("").Returns("empty"); await Assert.That(mock.Object.Greet("")).IsEqualTo("empty"); @@ -84,7 +84,7 @@ public async Task Implicit_Value_Empty_String_Matches() [Test] public async Task Implicit_Value_Mixed_With_Explicit_Matcher() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), 5).Returns(50); await Assert.That(mock.Object.Add(0, 5)).IsEqualTo(50); @@ -95,7 +95,7 @@ public async Task Implicit_Value_Mixed_With_Explicit_Matcher() [Test] public async Task Implicit_Value_Multiple_Setups_Last_Wins() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 1).Returns(10); mock.Add(1, 1).Returns(20); @@ -105,7 +105,7 @@ public async Task Implicit_Value_Multiple_Setups_Last_Wins() [Test] public async Task Implicit_Value_IntMaxValue_And_IntMinValue() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(int.MaxValue, int.MinValue).Returns(1); await Assert.That(mock.Object.Add(int.MaxValue, int.MinValue)).IsEqualTo(1); @@ -120,7 +120,7 @@ public async Task Implicit_Value_IntMaxValue_And_IntMinValue() [Test] public async Task Implicit_Predicate_Int_Greater_Than_Matches() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Is(x => x > 5), Any()).Returns(100); await Assert.That(mock.Object.Add(6, 0)).IsEqualTo(100); @@ -131,7 +131,7 @@ public async Task Implicit_Predicate_Int_Greater_Than_Matches() [Test] public async Task Implicit_Predicate_Int_Greater_Than_Does_Not_Match() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Is(x => x > 5), Any()).Returns(100); await Assert.That(mock.Object.Add(5, 0)).IsEqualTo(0); @@ -142,7 +142,7 @@ public async Task Implicit_Predicate_Int_Greater_Than_Does_Not_Match() [Test] public async Task Implicit_Predicate_String_StartsWith_Matches() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func startsWithHi = s => s != null && s.StartsWith("Hi"); mock.Greet(startsWithHi).Returns("matched"); @@ -153,7 +153,7 @@ public async Task Implicit_Predicate_String_StartsWith_Matches() [Test] public async Task Implicit_Predicate_String_StartsWith_Does_Not_Match() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func startsWithHi = s => s != null && s.StartsWith("Hi"); mock.Greet(startsWithHi).Returns("matched"); @@ -165,7 +165,7 @@ public async Task Implicit_Predicate_String_StartsWith_Does_Not_Match() [Test] public async Task Implicit_Predicate_Both_Args() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Is(x => x > 0), Is(x => x % 2 == 0)).Returns(42); await Assert.That(mock.Object.Add(1, 2)).IsEqualTo(42); @@ -183,7 +183,7 @@ public async Task Implicit_Predicate_Both_Args() [Test] public async Task Implicit_Predicate_String_Contains() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func containsWorld = s => s != null && s.Contains("world"); mock.Greet(containsWorld).Returns("has world"); @@ -195,7 +195,7 @@ public async Task Implicit_Predicate_String_Contains() [Test] public async Task Implicit_Predicate_String_Length_Check() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func shortString = s => s != null && s.Length <= 3; mock.Greet(shortString).Returns("short"); @@ -207,7 +207,7 @@ public async Task Implicit_Predicate_String_Length_Check() [Test] public async Task Implicit_Predicate_Always_True_Matches_Everything() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func always = _ => true; mock.Greet(always).Returns("always"); @@ -218,7 +218,7 @@ public async Task Implicit_Predicate_Always_True_Matches_Everything() [Test] public async Task Implicit_Predicate_Always_False_Matches_Nothing() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func never = _ => false; mock.Greet(never).Returns("never"); @@ -230,7 +230,7 @@ public async Task Implicit_Predicate_Always_False_Matches_Nothing() public async Task Implicit_Predicate_With_Closure() { var threshold = 10; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Is(x => x > threshold), Any()).Returns(1); await Assert.That(mock.Object.Add(11, 0)).IsEqualTo(1); @@ -240,7 +240,7 @@ public async Task Implicit_Predicate_With_Closure() [Test] public async Task Implicit_Predicate_Int_Range_Check() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Is(x => x >= 1 && x <= 10), Is(x => x >= 1 && x <= 10)).Returns(50); await Assert.That(mock.Object.Add(1, 10)).IsEqualTo(50); @@ -252,7 +252,7 @@ public async Task Implicit_Predicate_Int_Range_Check() [Test] public async Task Implicit_Predicate_Handles_Null_String() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func isNull = s => s is null; mock.Greet(isNull).Returns("was null"); @@ -264,7 +264,7 @@ public async Task Implicit_Predicate_Handles_Null_String() public async Task Implicit_Predicate_Func_Variable_For_String() { // Verifies the implicit Func → Arg operator works via variable - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func predicate = s => s != null && s.Length > 3; mock.Greet(predicate).Returns("long name"); @@ -275,7 +275,7 @@ public async Task Implicit_Predicate_Func_Variable_For_String() [Test] public async Task Implicit_Predicate_Func_Variable_Multiple_Setups() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); Func startsA = s => s != null && s.StartsWith("A"); Func startsB = s => s != null && s.StartsWith("B"); mock.Greet(startsA).Returns("A-name"); @@ -293,7 +293,7 @@ public async Task Implicit_Predicate_Func_Variable_Multiple_Setups() [Test] public async Task Implicit_Value_And_Predicate_Mixed() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(10, Is(x => x % 2 == 0)).Returns(77); // First arg must be exactly 10, second must be even @@ -310,7 +310,7 @@ public async Task Implicit_Value_And_Predicate_Mixed() [Test] public async Task Implicit_Predicate_Overrides_Earlier_Value_Setup() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(5, 5).Returns(10); mock.Add(Is(_ => true), Is(_ => true)).Returns(99); @@ -322,7 +322,7 @@ public async Task Implicit_Predicate_Overrides_Earlier_Value_Setup() [Test] public async Task Implicit_Value_Overrides_Earlier_Predicate_Setup() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Is(_ => true), Is(_ => true)).Returns(99); mock.Add(5, 5).Returns(10); @@ -335,7 +335,7 @@ public async Task Implicit_Value_Overrides_Earlier_Predicate_Setup() public async Task Implicit_Predicate_With_Capture_On_Other_Arg() { var captured = Any(); - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(captured, Is(x => x > 0)).Returns(1); mock.Object.Add(42, 1); diff --git a/TUnit.Mocks.Tests/InParameterTests.cs b/TUnit.Mocks.Tests/InParameterTests.cs index 53c9fc63d2..6bcfc596a3 100644 --- a/TUnit.Mocks.Tests/InParameterTests.cs +++ b/TUnit.Mocks.Tests/InParameterTests.cs @@ -34,7 +34,7 @@ public class InParameterTests [Test] public async Task In_Params_Returns_Value() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(1, 2).Returns(3); var result = mock.Object.Add(1, 2); @@ -45,7 +45,7 @@ public async Task In_Params_Returns_Value() [Test] public async Task In_Params_Arg_Any_Matching() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(Any(), Any()).Returns(42); var result = mock.Object.Add(10, 20); @@ -56,7 +56,7 @@ public async Task In_Params_Arg_Any_Matching() [Test] public async Task In_Params_Specific_Value_Matching() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(5, 10).Returns(15); mock.Add(1, 1).Returns(2); @@ -71,7 +71,7 @@ public async Task In_Params_Specific_Value_Matching() public async Task In_Params_Void_Method() { var wasCalled = false; - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Log(Any()).Callback(() => wasCalled = true); mock.Object.Log("hello"); @@ -82,7 +82,7 @@ public async Task In_Params_Void_Method() [Test] public void In_Params_Throws() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(Any(), Any()).Throws(); Assert.Throws(() => mock.Object.Add(1, 2)); @@ -91,7 +91,7 @@ public void In_Params_Throws() [Test] public async Task In_Params_Verify_WasCalled() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(Any(), Any()).Returns(0); mock.Object.Add(1, 2); @@ -104,7 +104,7 @@ public async Task In_Params_Verify_WasCalled() [Test] public async Task In_Params_Verify_WasNeverCalled() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(1, 2).WasNeverCalled(); await Assert.That(true).IsTrue(); @@ -113,7 +113,7 @@ public async Task In_Params_Verify_WasNeverCalled() [Test] public async Task In_Params_Mixed_With_Regular_Params() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Compute(Any(), Any()).Returns(99.5); var result = mock.Object.Compute(42, 2.0); @@ -124,7 +124,7 @@ public async Task In_Params_Mixed_With_Regular_Params() [Test] public async Task In_Params_Specific_Mixed_Matching() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Compute(10, 2.5).Returns(25.0); mock.Compute(20, 3.0).Returns(60.0); @@ -138,7 +138,7 @@ public async Task In_Params_Specific_Mixed_Matching() [Test] public async Task In_Struct_Params() { - var mock = Mock.Of(); + var mock = IGeometry.Mock(); mock.Distance(Any(), Any()).Returns(5.0); var origin = new Point { X = 0, Y = 0 }; @@ -151,7 +151,7 @@ public async Task In_Struct_Params() [Test] public async Task In_Struct_Mixed_With_Regular() { - var mock = Mock.Of(); + var mock = IGeometry.Mock(); mock.Contains(Any(), Any()).Returns(true); var center = new Point { X = 5, Y = 5 }; @@ -164,7 +164,7 @@ public async Task In_Struct_Mixed_With_Regular() public async Task In_Params_Callback_With_Args() { int capturedA = 0, capturedB = 0; - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(Any(), Any()) .Callback((int a, int b) => { @@ -182,7 +182,7 @@ public async Task In_Params_Callback_With_Args() [Test] public async Task In_Params_Verify_Specific_Values() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(Any(), Any()).Returns(0); mock.Object.Add(1, 2); @@ -198,7 +198,7 @@ public async Task In_Params_Verify_Specific_Values() public async Task In_String_Param_Matching() { var messages = new List(); - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Log(Any()).Callback((string msg) => messages.Add(msg)); mock.Object.Log("first"); @@ -212,7 +212,7 @@ public async Task In_String_Param_Matching() [Test] public async Task In_Params_Arg_Is_Predicate() { - var mock = Mock.Of(); + var mock = ICalculatorWithIn.Mock(); mock.Add(Is(x => x > 0), Is(x => x > 0)).Returns(100); var r1 = mock.Object.Add(5, 10); diff --git a/TUnit.Mocks.Tests/InvocationsTests.cs b/TUnit.Mocks.Tests/InvocationsTests.cs index 2bd0a3cb1e..c22fc48316 100644 --- a/TUnit.Mocks.Tests/InvocationsTests.cs +++ b/TUnit.Mocks.Tests/InvocationsTests.cs @@ -11,7 +11,7 @@ public interface IService [Test] public async Task Invocations_Returns_All_Calls() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var svc = mock.Object; @@ -25,7 +25,7 @@ public async Task Invocations_Returns_All_Calls() [Test] public async Task Invocations_Contains_Correct_Method_Names() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var svc = mock.Object; @@ -40,7 +40,7 @@ public async Task Invocations_Contains_Correct_Method_Names() [Test] public async Task Invocations_Contains_Correct_Arguments() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var svc = mock.Object; @@ -52,14 +52,14 @@ public async Task Invocations_Contains_Correct_Arguments() [Test] public async Task Invocations_Is_Empty_When_No_Calls_Made() { - var mock = Mock.Of(); + var mock = IService.Mock(); await Assert.That(mock.Invocations.Count).IsEqualTo(0); } [Test] public async Task Invocations_Is_Empty_After_Reset() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var svc = mock.Object; diff --git a/TUnit.Mocks.Tests/Issue5425Tests.cs b/TUnit.Mocks.Tests/Issue5425Tests.cs index 6dc35e9b8e..6cd68277f9 100644 --- a/TUnit.Mocks.Tests/Issue5425Tests.cs +++ b/TUnit.Mocks.Tests/Issue5425Tests.cs @@ -45,21 +45,21 @@ public interface IWithBothNullable [Test] public async Task Can_Mock_Event_With_Nullable_Type_Argument() { - var mock = Mock.Of(); + var mock = IWithNullableTypeArg.Mock(); await Assert.That(mock).IsNotNull(); } [Test] public async Task Can_Mock_Nullable_Event() { - var mock = Mock.Of(); + var mock = IWithNullableEvent.Mock(); await Assert.That(mock).IsNotNull(); } [Test] public async Task Can_Mock_Nullable_Event_With_Nullable_Type_Argument() { - var mock = Mock.Of(); + var mock = IWithBothNullable.Mock(); await Assert.That(mock).IsNotNull(); } } diff --git a/TUnit.Mocks.Tests/Issue5426Tests.cs b/TUnit.Mocks.Tests/Issue5426Tests.cs index 3a3cdaf2a8..9f1d27aef0 100644 --- a/TUnit.Mocks.Tests/Issue5426Tests.cs +++ b/TUnit.Mocks.Tests/Issue5426Tests.cs @@ -31,7 +31,7 @@ internal interface IInternalOrderRepository [Test] public async Task Can_Mock_Internal_Interface_With_Generic_Task_Method() { - var mock = Mock.Of(MockBehavior.Loose); + var mock = IInternalDatabaseService.Mock(MockBehavior.Loose); mock.GetOpenOrdersAsync().Returns(42); var result = await mock.Object.GetOpenOrdersAsync(); @@ -42,7 +42,7 @@ public async Task Can_Mock_Internal_Interface_With_Generic_Task_Method() [Test] public async Task Can_Mock_Internal_Interface_With_Internal_Parameter_Type() { - var mock = Mock.Of(MockBehavior.Loose); + var mock = IInternalDatabaseService.Mock(MockBehavior.Loose); mock.UpdateOrderProgressAsync(Arg.Any(), Arg.Any()) .Returns(); @@ -52,7 +52,7 @@ public async Task Can_Mock_Internal_Interface_With_Internal_Parameter_Type() [Test] public async Task Can_Mock_Internal_Interface_With_Internal_Return_Type() { - var mock = Mock.Of(MockBehavior.Loose); + var mock = IInternalOrderRepository.Mock(MockBehavior.Loose); mock.Get(Arg.Any()).Returns(new InternalOrderId(7)); var result = mock.Object.Get(1); diff --git a/TUnit.Mocks.Tests/Issue5434Tests.cs b/TUnit.Mocks.Tests/Issue5434Tests.cs index 0c60ce255d..8f5d2b1efc 100644 --- a/TUnit.Mocks.Tests/Issue5434Tests.cs +++ b/TUnit.Mocks.Tests/Issue5434Tests.cs @@ -13,14 +13,14 @@ public class Issue5434Tests [Test] public void Can_Mock_BlobClient() { - var mock = Mock.Of(MockBehavior.Strict); + var mock = BlobClient.Mock(MockBehavior.Strict); _ = mock.Object; } [Test] public void Can_Mock_TableClient() { - var mock = Mock.Of(MockBehavior.Strict); + var mock = TableClient.Mock(MockBehavior.Strict); _ = mock.Object; } @@ -30,7 +30,7 @@ public void Can_Mock_TableClient() [Test] public void Can_Configure_BlobClient_GenerateSasUri_OutOverload() { - var mock = Mock.Of(MockBehavior.Loose); + var mock = BlobClient.Mock(MockBehavior.Loose); _ = mock.GenerateSasUri(Arg.Any(), Arg.Any(), out _); } @@ -39,7 +39,7 @@ public void Can_Configure_BlobClient_GenerateSasUri_OutOverload() [Test] public void Can_Configure_TableClient_GetEntity_Generic() { - var mock = Mock.Of(MockBehavior.Loose); + var mock = TableClient.Mock(MockBehavior.Loose); _ = mock.GetEntity( Arg.Any(), Arg.Any(), diff --git a/TUnit.Mocks.Tests/Issue5453Tests.cs b/TUnit.Mocks.Tests/Issue5453Tests.cs index ae11b39c3b..1527653cbc 100644 --- a/TUnit.Mocks.Tests/Issue5453Tests.cs +++ b/TUnit.Mocks.Tests/Issue5453Tests.cs @@ -27,7 +27,7 @@ public interface IPublicGenericProcessor [Test] public async Task Can_Mock_Public_Generic_Interface_With_Internal_Type_Argument() { - var mock = Mock.Of>(MockBehavior.Loose); + var mock = IPublicGenericProcessor.Mock(MockBehavior.Loose); var instance = new InternalConsumer(); mock.Process(Arg.Any()).Returns(); @@ -42,7 +42,7 @@ public async Task Can_Mock_Public_Generic_Interface_With_Internal_Type_Argument( [Test] public async Task Can_Mock_Public_Generic_Interface_With_Internal_Partial_Type_Argument() { - var mock = Mock.Of>(MockBehavior.Loose); + var mock = IPublicGenericProcessor.Mock(MockBehavior.Loose); var instance = new InternalPartialConsumer(); mock.Get().Returns(instance); @@ -57,7 +57,7 @@ public async Task Can_Mock_Public_Generic_Interface_With_Internal_Partial_Type_A [Test] public async Task Can_Configure_Method_Overload_With_Internal_Type_Argument() { - var mock = Mock.Of>(MockBehavior.Loose); + var mock = IPublicGenericProcessor.Mock(MockBehavior.Loose); var instance = new InternalConsumer(); mock.GetAsync().Returns(instance); diff --git a/TUnit.Mocks.Tests/Issue5455Tests.cs b/TUnit.Mocks.Tests/Issue5455Tests.cs index bfc81847b2..96cb293f84 100644 --- a/TUnit.Mocks.Tests/Issue5455Tests.cs +++ b/TUnit.Mocks.Tests/Issue5455Tests.cs @@ -10,7 +10,7 @@ public class Issue5455Tests [Test] public void Mocking_Response_With_Internal_Setter_Compiles() { - var mock = Mock.Of(MockBehavior.Strict); + var mock = Response.Mock(MockBehavior.Strict); _ = mock.Object; } } diff --git a/TUnit.Mocks.Tests/MatcherTests.cs b/TUnit.Mocks.Tests/MatcherTests.cs index 72a3bc5c20..acfdea6ea4 100644 --- a/TUnit.Mocks.Tests/MatcherTests.cs +++ b/TUnit.Mocks.Tests/MatcherTests.cs @@ -12,7 +12,7 @@ public class MatcherTests public async Task InRange_MatchesWithinBounds() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(IsInRange(1, 10), Any()).Returns(99); // Act @@ -28,7 +28,7 @@ public async Task InRange_MatchesWithinBounds() public async Task InRange_RejectsOutsideBounds() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(IsInRange(1, 10), Any()).Returns(99); // Act @@ -45,7 +45,7 @@ public async Task InRange_RejectsOutsideBounds() public async Task IsIn_MatchesSetMembers() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(IsIn(1, 3, 5), Any()).Returns(77); // Act @@ -61,7 +61,7 @@ public async Task IsIn_MatchesSetMembers() public async Task IsIn_RejectsNonMembers() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(IsIn(1, 3, 5), Any()).Returns(77); // Act @@ -78,7 +78,7 @@ public async Task IsIn_RejectsNonMembers() public async Task IsNotIn_MatchesNonMembers() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(IsNotIn(1, 3, 5), Any()).Returns(88); // Act @@ -95,7 +95,7 @@ public async Task IsNotIn_MatchesNonMembers() public async Task IsNotIn_RejectsSetMembers() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(IsNotIn(1, 3, 5), Any()).Returns(88); // Act @@ -111,7 +111,7 @@ public async Task IsNotIn_RejectsSetMembers() public async Task Not_NegatesInnerMatcher() { // Arrange — Not(Is(5)) should match everything except 5 - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Not(Is(5)), Any()).Returns(66); // Act @@ -128,7 +128,7 @@ public async Task Not_NegatesInnerMatcher() public async Task Not_WithPredicateMatcher() { // Arrange — Not(Is(x => x > 0)) should match non-positive values - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Not(Is(x => x > 0)), Any()).Returns(55); // Act diff --git a/TUnit.Mocks.Tests/MockRepositoryTests.cs b/TUnit.Mocks.Tests/MockRepositoryTests.cs index da54b67ec3..e8e842c69e 100644 --- a/TUnit.Mocks.Tests/MockRepositoryTests.cs +++ b/TUnit.Mocks.Tests/MockRepositoryTests.cs @@ -168,7 +168,7 @@ public async Task Repository_Track_Adds_Existing_Mock() { // Arrange var repo = new MockRepository(); - var externalMock = Mock.Of(); + var externalMock = IRepoService.Mock(); // Act — track an externally-created mock repo.Track(externalMock); diff --git a/TUnit.Mocks.Tests/MockWrapperTypeTests.cs b/TUnit.Mocks.Tests/MockWrapperTypeTests.cs index c22a7a5e58..63f629ccc9 100644 --- a/TUnit.Mocks.Tests/MockWrapperTypeTests.cs +++ b/TUnit.Mocks.Tests/MockWrapperTypeTests.cs @@ -12,7 +12,7 @@ public class MockWrapperTypeTests [Test] public async Task Mock_Of_Returns_Wrapper_That_Implements_Interface() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); // The runtime type should implement IGreeter directly await Assert.That(mock is IGreeter).IsTrue(); @@ -21,7 +21,7 @@ public async Task Mock_Of_Returns_Wrapper_That_Implements_Interface() [Test] public async Task Wrapper_Can_Be_Cast_To_Interface() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Arg.Any()).Returns("Hello!"); // Cast via the wrapper type (which IS the interface) diff --git a/TUnit.Mocks.Tests/OrderedVerificationTests.cs b/TUnit.Mocks.Tests/OrderedVerificationTests.cs index 7db7410248..dc0200e889 100644 --- a/TUnit.Mocks.Tests/OrderedVerificationTests.cs +++ b/TUnit.Mocks.Tests/OrderedVerificationTests.cs @@ -12,7 +12,7 @@ public class OrderedVerificationTests public void Correct_Order_Passes() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act @@ -31,7 +31,7 @@ public void Correct_Order_Passes() public async Task Wrong_Order_Fails_With_Message() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — call GetName first, then Add @@ -55,8 +55,8 @@ public async Task Wrong_Order_Fails_With_Message() public void Cross_Mock_Ordering_Passes_When_Correct() { // Arrange - var calcMock = Mock.Of(); - var greeterMock = Mock.Of(); + var calcMock = ICalculator.Mock(); + var greeterMock = IGreeter.Mock(); ICalculator calc = calcMock.Object; IGreeter greeter = greeterMock.Object; @@ -78,8 +78,8 @@ public void Cross_Mock_Ordering_Passes_When_Correct() public async Task Cross_Mock_Ordering_Fails_When_Wrong() { // Arrange - var calcMock = Mock.Of(); - var greeterMock = Mock.Of(); + var calcMock = ICalculator.Mock(); + var greeterMock = IGreeter.Mock(); ICalculator calc = calcMock.Object; IGreeter greeter = greeterMock.Object; @@ -104,7 +104,7 @@ public async Task Cross_Mock_Ordering_Fails_When_Wrong() public void Single_Call_In_Ordered_Verification_Passes() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act @@ -121,7 +121,7 @@ public void Single_Call_In_Ordered_Verification_Passes() public async Task Error_Message_Describes_Expected_Vs_Actual_Order() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — call Log then Add @@ -159,7 +159,7 @@ public void Empty_Ordered_Verification_Passes() public async Task Missing_Call_Fails_With_Descriptive_Message() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — only call Add @@ -182,7 +182,7 @@ public async Task Missing_Call_Fails_With_Descriptive_Message() public void Multiple_Calls_Same_Method_Correct_Order() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act @@ -201,7 +201,7 @@ public void Multiple_Calls_Same_Method_Correct_Order() public async Task Multiple_Calls_Same_Method_Wrong_Order() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — call with (3,4) first, then (1,2) @@ -225,7 +225,7 @@ public async Task Multiple_Calls_Same_Method_Wrong_Order() public void VerifyInOrder_With_Times_Exactly_Multiple() { // Arrange — call Add(1,2) 3 times, then GetName once - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); @@ -245,7 +245,7 @@ public void VerifyInOrder_With_Times_Exactly_Multiple() public async Task VerifyInOrder_With_Times_Never_Throws_InvalidOperationException() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); @@ -265,7 +265,7 @@ public async Task VerifyInOrder_With_Times_Never_Throws_InvalidOperationExceptio public async Task VerifyInOrder_With_Times_AtMost_Throws_InvalidOperationException() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); @@ -285,7 +285,7 @@ public async Task VerifyInOrder_With_Times_AtMost_Throws_InvalidOperationExcepti public async Task VerifyInOrder_With_Times_Between_Zero_Min_Throws_InvalidOperationException() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); @@ -305,7 +305,7 @@ public async Task VerifyInOrder_With_Times_Between_Zero_Min_Throws_InvalidOperat public void VerifyInOrder_With_Times_AtLeast_Passes() { // Arrange — AtLeast is allowed since min > 0 - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); @@ -325,7 +325,7 @@ public void VerifyInOrder_With_Times_AtLeast_Passes() public void VerifyInOrder_Marks_Calls_As_Verified_For_VerifyNoOtherCalls() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act @@ -347,7 +347,7 @@ public void VerifyInOrder_Marks_Calls_As_Verified_For_VerifyNoOtherCalls() public async Task VerifyInOrder_Partial_Verification_Leaves_Unverified_Calls() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — three calls @@ -377,7 +377,7 @@ public void VerifyInOrder_Interleaved_Multi_Call_Correct_Group_Order() // Regression test for group-based ordering: // A(1), B, A(2) — verifying A(Times.Exactly(2)) then B should fail // because one of A's calls is after B - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); // first A diff --git a/TUnit.Mocks.Tests/OutRefAssignmentTests.cs b/TUnit.Mocks.Tests/OutRefAssignmentTests.cs index 6f5b35c9b7..7c7304a5d0 100644 --- a/TUnit.Mocks.Tests/OutRefAssignmentTests.cs +++ b/TUnit.Mocks.Tests/OutRefAssignmentTests.cs @@ -12,7 +12,7 @@ public class OutRefAssignmentTests public async Task Out_Parameter_Can_Be_Set_Via_Typed_Api() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.TryGet("found") .Returns(true) .SetsOutValue("found-value"); @@ -31,7 +31,7 @@ public async Task Out_Parameter_Can_Be_Set_Via_Typed_Api() public async Task Out_Parameter_Stays_Default_Without_Assignment() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.TryGet("key").Returns(false); IDictionary dict = mock.Object; @@ -48,7 +48,7 @@ public async Task Out_Parameter_Stays_Default_Without_Assignment() public async Task Out_Parameter_Int_Can_Be_Set_Via_Typed_Api() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.TryParse(Any()) .Returns(true) .SetsOutResult(42); @@ -67,7 +67,7 @@ public async Task Out_Parameter_Int_Can_Be_Set_Via_Typed_Api() public async Task Out_Parameter_With_Any_Matcher_Via_Typed_Api() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.TryGet(Any()) .Returns(true) .SetsOutValue("any-value"); @@ -87,7 +87,7 @@ public async Task Out_Parameter_With_Any_Matcher_Via_Typed_Api() public async Task Ref_Parameter_Can_Be_Set_Via_Typed_Api() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.Swap(Any()) .SetsRefValue(99); @@ -105,7 +105,7 @@ public async Task Ref_Parameter_Can_Be_Set_Via_Typed_Api() public async Task Typed_SetsOutValue_Works() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.TryGet("key") .Returns(true) .SetsOutValue("untyped-value"); @@ -124,7 +124,7 @@ public async Task Typed_SetsOutValue_Works() public async Task Typed_And_Chaining_Works() { // Arrange — chain typed out/ref setter with Returns - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.TryGet(Any()) .SetsOutValue("chained") .Returns(true); diff --git a/TUnit.Mocks.Tests/OutRefSpanTests.cs b/TUnit.Mocks.Tests/OutRefSpanTests.cs index 0856b90d02..afaee10650 100644 --- a/TUnit.Mocks.Tests/OutRefSpanTests.cs +++ b/TUnit.Mocks.Tests/OutRefSpanTests.cs @@ -26,7 +26,7 @@ public class OutRefSpanTests public async Task Out_ReadOnlySpan_Default_Works() { // Arrange - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Do().SetsOutBuffer(new ReadOnlySpan()); // Act @@ -41,7 +41,7 @@ public async Task Out_ReadOnlySpan_Default_Works() public async Task Out_ReadOnlySpan_With_Data() { // Arrange - var mock = Mock.Of(); + var mock = ISpanWriter.Mock(); mock.Do().SetsOutBuffer(new ReadOnlySpan([1, 2, 3])); // Act @@ -62,7 +62,7 @@ public async Task Out_ReadOnlySpan_With_Data() public async Task Out_ReadOnlySpan_Mixed_Params_With_Matching() { // Arrange — TryParse has a regular string param + out ReadOnlySpan - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse("hello") .Returns(true) .SetsOutData(new ReadOnlySpan([0xCA, 0xFE])); @@ -84,7 +84,7 @@ public async Task Out_ReadOnlySpan_Mixed_Params_With_Matching() public async Task Out_ReadOnlySpan_No_Setup_Stays_Default() { // Arrange — no SetsOut call - var mock = Mock.Of(); + var mock = ISpanParser.Mock(); mock.TryParse("key").Returns(false); // Act diff --git a/TUnit.Mocks.Tests/OutRefTests.cs b/TUnit.Mocks.Tests/OutRefTests.cs index a2b3ff1967..92e72a0b58 100644 --- a/TUnit.Mocks.Tests/OutRefTests.cs +++ b/TUnit.Mocks.Tests/OutRefTests.cs @@ -22,7 +22,7 @@ public class OutRefTests public async Task Out_Parameter_Method_Can_Be_Called() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); // Act - should not throw, out param gets default IDictionary dict = mock.Object; @@ -36,7 +36,7 @@ public async Task Out_Parameter_Method_Can_Be_Called() public async Task Out_Parameter_Method_Verify_Call_Was_Made() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); // Act IDictionary dict = mock.Object; @@ -51,7 +51,7 @@ public async Task Out_Parameter_Method_Verify_Call_Was_Made() public async Task Out_Parameter_Method_Setup_Return_Value() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.TryGet("found").Returns(true); // Act @@ -66,7 +66,7 @@ public async Task Out_Parameter_Method_Setup_Return_Value() public async Task Out_Parameter_Method_With_Any_Matcher() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); mock.TryGet(Any()).Returns(true); // Act @@ -83,7 +83,7 @@ public async Task Out_Parameter_Method_With_Any_Matcher() public async Task Out_Parameter_Int_Method_Returns_Default() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); // Act IDictionary dict = mock.Object; @@ -98,7 +98,7 @@ public async Task Out_Parameter_Int_Method_Returns_Default() public async Task Out_Parameter_Method_Verify_Never_Called() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); // Assert - never called mock.TryGet("key").WasNeverCalled(); @@ -109,7 +109,7 @@ public async Task Out_Parameter_Method_Verify_Never_Called() public async Task Ref_Parameter_Method_Can_Be_Called() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); // Act - ref param is passed in and out, but mock just records IDictionary dict = mock.Object; @@ -125,7 +125,7 @@ public async Task Ref_Parameter_Method_Can_Be_Called() public async Task Ref_Parameter_Method_Verify_Call() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); // Act IDictionary dict = mock.Object; @@ -141,7 +141,7 @@ public async Task Ref_Parameter_Method_Verify_Call() public async Task Multiple_Out_Method_Calls_Tracked() { // Arrange - var mock = Mock.Of(); + var mock = IDictionary.Mock(); // Act IDictionary dict = mock.Object; diff --git a/TUnit.Mocks.Tests/PartialMockTests.cs b/TUnit.Mocks.Tests/PartialMockTests.cs index 0deb9bf1c8..3041d0718f 100644 --- a/TUnit.Mocks.Tests/PartialMockTests.cs +++ b/TUnit.Mocks.Tests/PartialMockTests.cs @@ -143,7 +143,7 @@ public class PartialMockTests public async Task Of_Abstract_Class_Creates_Instance() { // Arrange & Act - var mock = Mock.Of(); + var mock = AbstractService.Mock(); // Assert await Assert.That(mock).IsNotNull(); @@ -154,7 +154,7 @@ public async Task Of_Abstract_Class_Creates_Instance() public async Task Abstract_Method_Returns_Configured_Value() { // Arrange - var mock = Mock.Of(); + var mock = AbstractService.Mock(); mock.GetName().Returns("TestName"); // Act @@ -168,7 +168,7 @@ public async Task Abstract_Method_Returns_Configured_Value() public async Task Unconfigured_Virtual_Method_Calls_Base_Implementation() { // Arrange - var mock = Mock.Of(); + var mock = AbstractService.Mock(); // GetName is abstract - configure it mock.GetName().Returns("TestName"); // Calculate is virtual - do NOT configure it @@ -184,7 +184,7 @@ public async Task Unconfigured_Virtual_Method_Calls_Base_Implementation() public async Task Configured_Virtual_Method_Returns_Override_Instead_Of_Base() { // Arrange - var mock = Mock.Of(); + var mock = AbstractService.Mock(); mock.GetName().Returns("TestName"); mock.Calculate(Any()).Returns(42); @@ -199,7 +199,7 @@ public async Task Configured_Virtual_Method_Returns_Override_Instead_Of_Base() public async Task Concrete_Class_Partial_Mock_Calls_Base_When_Not_Configured() { // Arrange - var mock = Mock.Of(); + var mock = ConcreteService.Mock(); // Act - no setup, should call base var result = mock.Object.Greet("World"); @@ -212,7 +212,7 @@ public async Task Concrete_Class_Partial_Mock_Calls_Base_When_Not_Configured() public async Task Concrete_Class_Override_Returns_Configured_Value() { // Arrange - var mock = Mock.Of(); + var mock = ConcreteService.Mock(); mock.Greet(Any()).Returns("Mocked!"); // Act @@ -226,7 +226,7 @@ public async Task Concrete_Class_Override_Returns_Configured_Value() public async Task Concrete_Class_Multiple_Methods_Mixed_Setup() { // Arrange - var mock = Mock.Of(); + var mock = ConcreteService.Mock(); mock.Greet("Alice").Returns("Hi Alice!"); // Don't setup Add - let it call base @@ -243,7 +243,7 @@ public async Task Concrete_Class_Multiple_Methods_Mixed_Setup() public async Task Constructor_Args_Passed_To_Base() { // Arrange - var mock = Mock.Of("PREFIX"); + var mock = ServiceWithConstructor.Mock("PREFIX"); mock.Format(Any()).Returns("formatted"); // Act - GetPrefix is virtual and unconfigured, so calls base which uses _prefix @@ -257,7 +257,7 @@ public async Task Constructor_Args_Passed_To_Base() public async Task Constructor_Args_Abstract_Method_Override() { // Arrange - var mock = Mock.Of("test"); + var mock = ServiceWithConstructor.Mock("test"); mock.Format("value").Returns("test:value"); // Act @@ -271,7 +271,7 @@ public async Task Constructor_Args_Abstract_Method_Override() public async Task Non_Virtual_Method_Still_Works() { // Arrange - var mock = Mock.Of(); + var mock = AbstractService.Mock(); mock.GetName().Returns("Name"); // Act - NonVirtualMethod is not virtual, so it runs the original implementation @@ -285,7 +285,7 @@ public async Task Non_Virtual_Method_Still_Works() public void Verify_Calls_On_Partial_Mock() { // Arrange - var mock = Mock.Of(); + var mock = ConcreteService.Mock(); mock.Greet(Any()).Returns("Hi"); // Act @@ -300,7 +300,7 @@ public void Verify_Calls_On_Partial_Mock() public void Verify_Calls_On_Unconfigured_Virtual_Method() { // Arrange - var mock = Mock.Of(); + var mock = ConcreteService.Mock(); // Act - unconfigured, calls base mock.Object.Add(1, 2); @@ -314,7 +314,7 @@ public void Verify_Calls_On_Unconfigured_Virtual_Method() public async Task Partial_Mock_With_Strict_Behavior_Abstract_Method_Throws_Without_Setup() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = AbstractService.Mock(MockBehavior.Strict); // Act & Assert - abstract method with no setup in strict mode should throw var exception = Assert.Throws(() => @@ -329,7 +329,7 @@ public async Task Partial_Mock_With_Strict_Behavior_Abstract_Method_Throws_Witho public async Task Partial_Mock_With_Strict_Behavior_Virtual_Method_Calls_Base() { // Arrange - strict mode, but virtual methods should still call base when unconfigured - var mock = Mock.Of(MockBehavior.Strict); + var mock = ConcreteService.Mock(MockBehavior.Strict); // Act - virtual method with no setup should call base (not throw) var result = mock.Object.Add(2, 3); @@ -346,7 +346,7 @@ public async Task Partial_Mock_With_Strict_Behavior_Virtual_Method_Calls_Base() public async Task New_Method_Hiding__Non_Hidden_Virtual_Can_Be_Configured() { // DerivedClientWithNewMethods hides WithSnapshot/WithVersion but not Calculate - var mock = Mock.Of(); + var mock = DerivedClientWithNewMethods.Mock(); mock.Calculate(Any()).Returns(42); var result = mock.Object.Calculate(5); @@ -357,7 +357,7 @@ public async Task New_Method_Hiding__Non_Hidden_Virtual_Can_Be_Configured() [Test] public async Task New_Method_Hiding__Non_Hidden_Virtual_Falls_Back_To_Base() { - var mock = Mock.Of(); + var mock = DerivedClientWithNewMethods.Mock(); // Calculate is virtual in base and not hidden — unconfigured should call base (x * 2) var result = mock.Object.Calculate(7); @@ -368,7 +368,7 @@ public async Task New_Method_Hiding__Non_Hidden_Virtual_Falls_Back_To_Base() [Test] public async Task New_Method_Hiding__Strict_Mode_Works() { - var mock = Mock.Of(MockBehavior.Strict); + var mock = DerivedClientWithNewMethods.Mock(MockBehavior.Strict); mock.Calculate(Any()).Returns(99); var result = mock.Object.Calculate(10); @@ -379,7 +379,7 @@ public async Task New_Method_Hiding__Strict_Mode_Works() [Test] public void New_Method_Hiding__Verify_Calls_On_Non_Hidden_Virtual() { - var mock = Mock.Of(); + var mock = DerivedClientWithNewMethods.Mock(); mock.Object.Calculate(1); mock.Object.Calculate(2); @@ -391,7 +391,7 @@ public void New_Method_Hiding__Verify_Calls_On_Non_Hidden_Virtual() public async Task New_Property_Hiding__Non_Hidden_Virtual_Property_Can_Be_Configured() { // DerivedClientWithNewProperties hides Name but not Priority - var mock = Mock.Of(); + var mock = DerivedClientWithNewProperties.Mock(); mock.Priority.Returns(42); var result = mock.Object.Priority; @@ -402,7 +402,7 @@ public async Task New_Property_Hiding__Non_Hidden_Virtual_Property_Can_Be_Config [Test] public async Task Mixed_New_And_Override__Override_Method_Can_Be_Configured() { - var mock = Mock.Of(); + var mock = MixedNewAndOverrideClient.Mock(); mock.WithVersion(Any()).Returns("mocked-version"); var result = mock.Object.WithVersion("v1"); @@ -413,7 +413,7 @@ public async Task Mixed_New_And_Override__Override_Method_Can_Be_Configured() [Test] public async Task Mixed_New_And_Override__Override_Method_Falls_Back_To_Override() { - var mock = Mock.Of(); + var mock = MixedNewAndOverrideClient.Mock(); // WithVersion is overridden (not hidden) — unconfigured should call the override var result = mock.Object.WithVersion("v1"); @@ -424,7 +424,7 @@ public async Task Mixed_New_And_Override__Override_Method_Falls_Back_To_Override [Test] public async Task Mixed_New_And_Override__Non_Hidden_Virtual_Still_Works() { - var mock = Mock.Of(); + var mock = MixedNewAndOverrideClient.Mock(); mock.Calculate(Any()).Returns(100); var result = mock.Object.Calculate(3); @@ -435,7 +435,7 @@ public async Task Mixed_New_And_Override__Non_Hidden_Virtual_Still_Works() [Test] public async Task Mixed_New_And_Override__Override_Property_Can_Be_Configured() { - var mock = Mock.Of(); + var mock = MixedNewAndOverrideClient.Mock(); mock.Priority.Returns(7); var result = mock.Object.Priority; @@ -448,7 +448,7 @@ public async Task Three_Level_Hierarchy__Grandchild_Hides_Middle_Override() { // GrandchildClient hides MiddleClient.WithSnapshot (which overrides base) // Only Calculate should be mockable - var mock = Mock.Of(); + var mock = GrandchildClient.Mock(); mock.Calculate(Any()).Returns(55); var result = mock.Object.Calculate(1); @@ -459,7 +459,7 @@ public async Task Three_Level_Hierarchy__Grandchild_Hides_Middle_Override() [Test] public async Task Three_Level_Hierarchy__Non_Hidden_Virtuals_Fall_Back_To_Base() { - var mock = Mock.Of(); + var mock = GrandchildClient.Mock(); // WithVersion is not hidden at any level — unconfigured should call base var result = mock.Object.WithVersion("v2"); @@ -471,7 +471,7 @@ public async Task Three_Level_Hierarchy__Non_Hidden_Virtuals_Fall_Back_To_Base() public async Task New_Virtual__Re_Introduced_Virtual_Can_Be_Configured() { // NewVirtualClient uses 'new virtual' — starts a new virtual chain - var mock = Mock.Of(); + var mock = NewVirtualClient.Mock(); mock.WithSnapshot(Any()).Returns("mocked-snap"); var result = mock.Object.WithSnapshot("s1"); @@ -482,7 +482,7 @@ public async Task New_Virtual__Re_Introduced_Virtual_Can_Be_Configured() [Test] public async Task New_Virtual__Unconfigured_Falls_Back_To_New_Virtual_Base() { - var mock = Mock.Of(); + var mock = NewVirtualClient.Mock(); var result = mock.Object.WithSnapshot("s1"); @@ -492,7 +492,7 @@ public async Task New_Virtual__Unconfigured_Falls_Back_To_New_Virtual_Base() [Test] public async Task New_Virtual_Derived__Can_Configure_Override_Of_New_Virtual() { - var mock = Mock.Of(); + var mock = NewVirtualDerivedClient.Mock(); mock.WithSnapshot(Any()).Returns("fully-mocked"); var result = mock.Object.WithSnapshot("s1"); @@ -503,7 +503,7 @@ public async Task New_Virtual_Derived__Can_Configure_Override_Of_New_Virtual() [Test] public async Task New_Virtual_Derived__Unconfigured_Falls_Back_To_Derived_Override() { - var mock = Mock.Of(); + var mock = NewVirtualDerivedClient.Mock(); var result = mock.Object.WithSnapshot("s1"); @@ -556,7 +556,7 @@ public void Wrap_Mode__Verify_Calls_On_Class_With_New_Methods() public async Task Complex_Mixture__Non_Hidden_Overload_Can_Be_Configured() { // Execute(string,int,bool) is NOT hidden — should be mockable - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); mock.Execute(Any(), Any(), Any()).Returns("mocked-3-arg"); var result = mock.Object.Execute("cmd", 30, true); @@ -567,7 +567,7 @@ public async Task Complex_Mixture__Non_Hidden_Overload_Can_Be_Configured() [Test] public async Task Complex_Mixture__Non_Hidden_Overload_Falls_Back_To_Base() { - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); // Execute(string,int,bool) not configured — should call base var result = mock.Object.Execute("cmd", 30, true); @@ -578,7 +578,7 @@ public async Task Complex_Mixture__Non_Hidden_Overload_Falls_Back_To_Base() [Test] public async Task Complex_Mixture__Override_Method_Can_Be_Configured() { - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); mock.GetStatus().Returns(42); var result = mock.Object.GetStatus(); @@ -589,7 +589,7 @@ public async Task Complex_Mixture__Override_Method_Can_Be_Configured() [Test] public async Task Complex_Mixture__Override_Method_Falls_Back_To_Derived_Implementation() { - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); // GetStatus is overridden — unconfigured should call the override (returns 1) var result = mock.Object.GetStatus(); @@ -600,7 +600,7 @@ public async Task Complex_Mixture__Override_Method_Falls_Back_To_Derived_Impleme [Test] public async Task Complex_Mixture__Non_Hidden_Format_Overloads_Can_Be_Configured() { - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); // Format(int) is NOT hidden mock.Format(Any()).Returns("mocked-int-fmt"); @@ -616,7 +616,7 @@ public async Task Complex_Mixture__Non_Hidden_Format_Overloads_Can_Be_Configured [Test] public async Task Complex_Mixture__Non_Hidden_Format_Overloads_Fall_Back_To_Base() { - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); var result1 = mock.Object.Format(42); await Assert.That(result1).IsEqualTo("base-fmt-42"); @@ -628,7 +628,7 @@ public async Task Complex_Mixture__Non_Hidden_Format_Overloads_Fall_Back_To_Base [Test] public async Task Complex_Mixture__Non_Hidden_Properties_Can_Be_Configured() { - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); // Priority and Description are not hidden — should be mockable mock.Priority.Returns(10); @@ -641,7 +641,7 @@ public async Task Complex_Mixture__Non_Hidden_Properties_Can_Be_Configured() [Test] public void Complex_Mixture__Verify_Calls_On_Non_Hidden_Members() { - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); mock.Object.Execute("a", 1, true); mock.Object.Execute("b", 2, false); @@ -657,7 +657,7 @@ public void Complex_Mixture__Verify_Calls_On_Non_Hidden_Members() public async Task Complex_Mixture__Non_Hidden_Event_Can_Be_Raised() { // StatusChanged is hidden by 'new'; MessageReceived remains virtual from base - var mock = Mock.Of(); + var mock = ComplexDerivedService.Mock(); string? received = null; mock.Object.MessageReceived += (_, msg) => received = msg; diff --git a/TUnit.Mocks.Tests/PerformanceOptimizationTests.cs b/TUnit.Mocks.Tests/PerformanceOptimizationTests.cs index 089ef49251..2afbba5a6e 100644 --- a/TUnit.Mocks.Tests/PerformanceOptimizationTests.cs +++ b/TUnit.Mocks.Tests/PerformanceOptimizationTests.cs @@ -21,7 +21,7 @@ public class PerformanceOptimizationTests [Test] public async Task Invocations_Track_Per_Member_Counts_Correctly() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); mock.GetName().Returns("test"); ICalculator calc = mock.Object; @@ -47,7 +47,7 @@ public async Task Invocations_Track_Per_Member_Counts_Correctly() public async Task Invocations_Per_Member_Independent_After_Reset() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -70,7 +70,7 @@ public async Task Invocations_Per_Member_Independent_After_Reset() public async Task GetCallsFor_Returns_Only_Matching_Member_Calls() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); mock.GetName().Returns("test"); ICalculator calc = mock.Object; @@ -96,7 +96,7 @@ public async Task GetCallsFor_Returns_Only_Matching_Member_Calls() public async Task Setups_For_Multiple_Members_Work_Independently() { // Arrange — setup all 3 members of ICalculator - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); mock.Add(10, 20).Returns(30); mock.GetName().Returns("calculator"); @@ -113,7 +113,7 @@ public async Task Setups_For_Multiple_Members_Work_Independently() public async Task Many_Setups_On_Same_Member_Last_Wins() { // Arrange — multiple setups with same args, last should win - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(10); mock.Add(1, 2).Returns(20); mock.Add(1, 2).Returns(30); @@ -129,7 +129,7 @@ public async Task Setup_Storage_Handles_Interface_With_Many_Members() { // Arrange — IUserRepository has 7 methods, testing that the flat array // handles larger interfaces correctly - var mock = Mock.Of(); + var mock = IUserRepository.Mock(); var user = new UserDto { Id = 1, Name = "Alice" }; mock.GetByIdAsync(1).Returns(user); @@ -155,7 +155,7 @@ public async Task Setup_Storage_Handles_Interface_With_Many_Members() public async Task Verification_Zero_Param_Method_Uses_Fast_Path() { // GetName() has zero parameters, so _matchers.Length == 0 → fast path (per-member counter) - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.GetName().Returns("test"); ICalculator calc = mock.Object; @@ -173,7 +173,7 @@ public async Task Verification_Zero_Param_Method_Uses_Fast_Path() public async Task Verification_With_Any_Matchers_Uses_Matcher_Path() { // Any() creates argument matchers, so _matchers.Length > 0 → matcher path - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -192,7 +192,7 @@ public async Task Verification_With_Any_Matchers_Uses_Matcher_Path() [Test] public async Task Verification_With_Exact_Args_Uses_Matcher_Path() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -210,7 +210,7 @@ public async Task Verification_With_Exact_Args_Uses_Matcher_Path() [Test] public async Task Verification_WasNeverCalled_Zero_Param_Method() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Zero-param method → fast path with per-member counter = 0 mock.GetName().WasNeverCalled(); @@ -220,7 +220,7 @@ public async Task Verification_WasNeverCalled_Zero_Param_Method() [Test] public async Task Verification_WasNeverCalled_With_Matchers() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Any() creates matchers → matcher path, but still zero calls mock.Add(Any(), Any()).WasNeverCalled(); @@ -232,7 +232,7 @@ public async Task Verification_WasNeverCalled_With_Matchers() public async Task Verification_Failure_With_No_Matchers_Shows_Correct_Message() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; calc.Add(1, 2); @@ -251,7 +251,7 @@ public async Task Verification_Failure_With_No_Matchers_Shows_Correct_Message() public async Task Concurrent_Calls_To_Multiple_Members_All_Recorded() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); mock.GetName().Returns("test"); ICalculator calc = mock.Object; @@ -271,7 +271,7 @@ public async Task Concurrent_Calls_To_Multiple_Members_All_Recorded() public async Task Concurrent_Setup_Then_Calls_Across_Members() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — setup and call concurrently across members var setupAndCallTasks = Enumerable.Range(0, 20).Select(i => Task.Run(() => @@ -289,7 +289,7 @@ public async Task Concurrent_Setup_Then_Calls_Across_Members() public async Task Concurrent_Verification_With_Per_Member_Counters() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -316,7 +316,7 @@ public async Task Concurrent_Verification_With_Per_Member_Counters() public async Task VerifyAll_Works_With_Flat_Array_Setup_Storage() { // Arrange — setups across multiple members - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); mock.GetName().Returns("test"); @@ -333,7 +333,7 @@ public async Task VerifyAll_Works_With_Flat_Array_Setup_Storage() public async Task VerifyAll_Fails_When_Setup_Not_Invoked_With_Flat_Array() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); mock.GetName().Returns("test"); @@ -349,7 +349,7 @@ public async Task VerifyAll_Fails_When_Setup_Not_Invoked_With_Flat_Array() public async Task VerifyNoOtherCalls_Works_With_Per_Member_Index() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -368,7 +368,7 @@ public async Task VerifyNoOtherCalls_Works_With_Per_Member_Index() public async Task VerifyNoOtherCalls_Fails_With_Unverified_Member() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); mock.GetName().Returns("test"); ICalculator calc = mock.Object; @@ -392,7 +392,7 @@ public async Task VerifyNoOtherCalls_Fails_With_Unverified_Member() public async Task Reset_Clears_Per_Member_Call_Index_And_Counters() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -415,7 +415,7 @@ public async Task Reset_Clears_Per_Member_Call_Index_And_Counters() public async Task Reset_Clears_Flat_Array_Setups_And_Allows_Reconfiguration() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(100); mock.GetName().Returns("first"); ICalculator calc = mock.Object; @@ -436,7 +436,7 @@ public async Task Reset_Clears_Flat_Array_Setups_And_Allows_Reconfiguration() [Test] public async Task Multiple_Reset_Cycles_Work_Correctly() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; for (int cycle = 0; cycle < 5; cycle++) @@ -461,7 +461,7 @@ public async Task Multiple_Reset_Cycles_Work_Correctly() public async Task Verification_Before_Any_Setup_Or_Call() { // Arrange — fresh mock, no setups, no calls - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Assert — should not throw, all members have zero calls mock.Add(Any(), Any()).WasNeverCalled(); @@ -474,7 +474,7 @@ public async Task Verification_Before_Any_Setup_Or_Call() public async Task Call_Without_Setup_Still_Recorded_In_Per_Member_Index() { // Arrange — no setup, loose mode - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — call without any setup diff --git a/TUnit.Mocks.Tests/PropertyTests.cs b/TUnit.Mocks.Tests/PropertyTests.cs index 00f559cb28..c1952a0de7 100644 --- a/TUnit.Mocks.Tests/PropertyTests.cs +++ b/TUnit.Mocks.Tests/PropertyTests.cs @@ -26,7 +26,7 @@ public class PropertyTests public async Task Getter_Returns_Default_When_Not_Configured() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); // Act IPropertyService svc = mock.Object; @@ -40,7 +40,7 @@ public async Task Getter_Returns_Default_When_Not_Configured() public async Task Getter_Returns_Configured_Value() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); mock.Name.Returns("TestName"); // Act @@ -55,7 +55,7 @@ public async Task Getter_Returns_Configured_Value() public async Task Getter_Returns_Configured_Int_Value() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); mock.Count.Returns(42); // Act @@ -70,7 +70,7 @@ public async Task Getter_Returns_Configured_Int_Value() public async Task Setter_Records_Call() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); // Act IPropertyService svc = mock.Object; @@ -85,7 +85,7 @@ public async Task Setter_Records_Call() public async Task Setter_Verify_With_Any_Matcher() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); // Act IPropertyService svc = mock.Object; @@ -102,7 +102,7 @@ public async Task Setter_Verify_With_Any_Matcher() public async Task Setter_Verify_With_Specific_Value() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); // Act IPropertyService svc = mock.Object; @@ -119,7 +119,7 @@ public async Task Setter_Verify_With_Specific_Value() public async Task Setter_Verify_Never_Called() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); // Act — don't set anything @@ -132,7 +132,7 @@ public async Task Setter_Verify_Never_Called() public async Task Getter_Verify_Was_Called() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); // Act IPropertyService svc = mock.Object; @@ -148,7 +148,7 @@ public async Task Getter_Verify_Was_Called() public async Task Getter_Verify_Never_Called() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); // Act — don't access the property @@ -161,7 +161,7 @@ public async Task Getter_Verify_Never_Called() public async Task Getter_Returns_Default_Int_When_Not_Configured() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); // Act IPropertyService svc = mock.Object; @@ -175,7 +175,7 @@ public async Task Getter_Returns_Default_Int_When_Not_Configured() public async Task Multiple_Getter_Setups_Last_Wins() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); mock.Name.Returns("First"); mock.Name.Returns("Second"); @@ -191,7 +191,7 @@ public async Task Multiple_Getter_Setups_Last_Wins() public async Task Setter_Setup_Callback() { // Arrange - var mock = Mock.Of(); + var mock = IPropertyService.Mock(); var callbackCalled = false; Action callback = () => callbackCalled = true; mock.Count.Set(Any()).Callback(callback); diff --git a/TUnit.Mocks.Tests/ProtectedMemberTests.cs b/TUnit.Mocks.Tests/ProtectedMemberTests.cs index 541d051995..d75f24430e 100644 --- a/TUnit.Mocks.Tests/ProtectedMemberTests.cs +++ b/TUnit.Mocks.Tests/ProtectedMemberTests.cs @@ -32,7 +32,7 @@ public class ProtectedMemberTests public async Task Protected_Virtual_Method_Calls_Base_When_Not_Configured() { // Arrange - var mock = Mock.Of(); + var mock = ProtectedServiceBase.Mock(); mock.GetName().Returns("Test"); mock.FormatResult(Any()).Returns("formatted"); @@ -48,7 +48,7 @@ public async Task Protected_Virtual_Method_Calls_Base_When_Not_Configured() public async Task Protected_Virtual_Method_Can_Be_Configured() { // Arrange - var mock = Mock.Of(); + var mock = ProtectedServiceBase.Mock(); mock.GetName().Returns("Test"); mock.ComputeValue(Any()).Returns(42); mock.FormatResult(Any()).Returns("configured"); @@ -65,7 +65,7 @@ public async Task Protected_Virtual_Method_Can_Be_Configured() public async Task Protected_Abstract_Method_Can_Be_Configured() { // Arrange - var mock = Mock.Of(); + var mock = ProtectedServiceBase.Mock(); mock.GetName().Returns("Test"); mock.FormatResult(Any()).Returns("custom format"); @@ -80,7 +80,7 @@ public async Task Protected_Abstract_Method_Can_Be_Configured() public async Task Protected_Method_Calls_Are_Recorded_In_Invocations() { // Arrange - var mock = Mock.Of(); + var mock = ProtectedServiceBase.Mock(); mock.GetName().Returns("Test"); mock.FormatResult(Any()).Returns("result"); @@ -95,7 +95,7 @@ public async Task Protected_Method_Calls_Are_Recorded_In_Invocations() public async Task Protected_Method_Can_Be_Verified() { // Arrange - var mock = Mock.Of(); + var mock = ProtectedServiceBase.Mock(); mock.GetName().Returns("Test"); mock.FormatResult(Any()).Returns("result"); diff --git a/TUnit.Mocks.Tests/RealWorldScenarioTests.cs b/TUnit.Mocks.Tests/RealWorldScenarioTests.cs index 350fba7408..785cdc242c 100644 --- a/TUnit.Mocks.Tests/RealWorldScenarioTests.cs +++ b/TUnit.Mocks.Tests/RealWorldScenarioTests.cs @@ -146,7 +146,7 @@ public class RealWorldScenarioTests public async Task Repository_CRUD_Full_Lifecycle() { // Arrange - var mock = Mock.Of(); + var mock = IUserRepository.Mock(); var user = new UserDto { Id = 1, Name = "Alice", Email = "alice@example.com" }; mock.CreateAsync(Any()).Returns(user); @@ -183,7 +183,7 @@ public async Task Repository_CRUD_Full_Lifecycle() public async Task Repository_With_CancellationToken_Default_Parameter() { // Arrange - var mock = Mock.Of(); + var mock = IUserRepository.Mock(); var users = new List { new() { Id = 1, Name = "Alice Smith", Email = "alice@example.com" }, @@ -209,8 +209,8 @@ public async Task Repository_With_CancellationToken_Default_Parameter() public async Task UnitOfWork_Transaction_Commit_Flow() { // Arrange - var mockTx = Mock.Of(); - var mockUow = Mock.Of(); + var mockTx = ITransaction.Mock(); + var mockUow = IUnitOfWork.Mock(); mockUow.BeginTransactionAsync().Returns(mockTx.Object); IUnitOfWork uow = mockUow.Object; @@ -231,8 +231,8 @@ public async Task UnitOfWork_Transaction_Commit_Flow() public async Task UnitOfWork_Transaction_Rollback_On_Exception() { // Arrange - var mockTx = Mock.Of(); - var mockUow = Mock.Of(); + var mockTx = ITransaction.Mock(); + var mockUow = IUnitOfWork.Mock(); mockUow.BeginTransactionAsync().Returns(mockTx.Object); mockUow.SaveChangesAsync(Any()) .Throws(); @@ -259,7 +259,7 @@ public async Task UnitOfWork_Transaction_Rollback_On_Exception() public async Task Repository_Returns_Null_For_NotFound() { // Arrange - var mock = Mock.Of(); + var mock = IUserRepository.Mock(); mock.GetByIdAsync(999).Returns((UserDto?)null); IUserRepository repo = mock.Object; @@ -279,9 +279,9 @@ public async Task Repository_Returns_Null_For_NotFound() public async Task Multiple_Mocks_Injected_Into_Service_Orchestration() { // Arrange — create 3 mocks that a hypothetical service would depend on - var mockRepo = Mock.Of(); - var mockNotify = Mock.Of(); - var mockLogger = Mock.Of(); + var mockRepo = IUserRepository.Mock(); + var mockNotify = INotificationService.Mock(); + var mockLogger = ILogger.Mock(); var user = new UserDto { Id = 1, Name = "Bob", Email = "bob@example.com" }; mockRepo.GetByIdAsync(1).Returns(user); @@ -306,7 +306,7 @@ public async Task Multiple_Mocks_Injected_Into_Service_Orchestration() public async Task Logger_Method_Overloads_Distinct_Setups() { // Arrange - var mock = Mock.Of(); + var mock = ILogger.Mock(); var twoArgCallCount = 0; var threeArgCallCount = 0; @@ -334,7 +334,7 @@ public async Task Logger_Method_Overloads_Distinct_Setups() public async Task Cache_Generic_Methods_With_Different_Types() { // Arrange - var mock = Mock.Of(); + var mock = ICache.Mock(); var user = new UserDto { Id = 1, Name = "Alice", Email = "alice@example.com" }; var order = new OrderDto { OrderId = 42, ItemName = "Widget", Price = 9.99m }; @@ -362,7 +362,7 @@ public async Task Cache_Generic_Methods_With_Different_Types() public async Task Notification_Conditional_Send() { // Arrange — SendSmsAsync returns true for one number, false for another - var mock = Mock.Of(); + var mock = INotificationService.Mock(); mock.SendSmsAsync("+1234567890", Any()).Returns(true); mock.SendSmsAsync("+0000000000", Any()).Returns(false); @@ -385,7 +385,7 @@ public async Task Notification_Conditional_Send() public async Task Complex_Dictionary_Return_Type() { // Arrange - var mock = Mock.Of(); + var mock = IAnalyticsService.Mock(); var metrics = new Dictionary> { ["revenue"] = [100.50m, 200.75m, 300.00m], @@ -410,7 +410,7 @@ public async Task Complex_Dictionary_Return_Type() public async Task Tuple_Return_Type() { // Arrange - var mock = Mock.Of(); + var mock = IAnalyticsService.Mock(); mock.Validate("good-input").Returns((true, (string?)null)); mock.Validate("bad-input").Returns((false, (string?)"Invalid format")); @@ -431,7 +431,7 @@ public async Task Tuple_Return_Type() public async Task ReadOnlyDictionary_Return() { // Arrange - var mock = Mock.Of(); + var mock = IAnalyticsService.Mock(); var lookup = new Dictionary { [1] = "Active", @@ -462,9 +462,9 @@ public async Task ReadOnlyDictionary_Return() public async Task DI_Integration_Happy_Path() { // Arrange - var mockRepo = Mock.Of(); - var mockNotify = Mock.Of(); - var mockLogger = Mock.Of(); + var mockRepo = IUserRepository.Mock(); + var mockNotify = INotificationService.Mock(); + var mockLogger = ILogger.Mock(); var user = new UserDto { Id = 1, Name = "Alice", Email = "alice@example.com" }; mockRepo.GetByIdAsync(1).Returns(user); @@ -495,9 +495,9 @@ public async Task DI_Integration_Happy_Path() public async Task DI_Integration_User_Not_Found() { // Arrange - var mockRepo = Mock.Of(); - var mockNotify = Mock.Of(); - var mockLogger = Mock.Of(); + var mockRepo = IUserRepository.Mock(); + var mockNotify = INotificationService.Mock(); + var mockLogger = ILogger.Mock(); mockRepo.GetByIdAsync(999).Returns((UserDto?)null); @@ -522,9 +522,9 @@ public async Task DI_Integration_User_Not_Found() public async Task DI_Integration_Verify_Exact_Email_Content() { // Arrange - var mockRepo = Mock.Of(); - var mockNotify = Mock.Of(); - var mockLogger = Mock.Of(); + var mockRepo = IUserRepository.Mock(); + var mockNotify = INotificationService.Mock(); + var mockLogger = ILogger.Mock(); var bodyArg = Any(); @@ -553,7 +553,7 @@ public async Task DI_Integration_Verify_Exact_Email_Content() public async Task Nullable_String_Return_Configured_Null() { // Arrange - var mock = Mock.Of(); + var mock = INullableService.Mock(); mock.GetNullableString(1).Returns((string?)null); INullableService svc = mock.Object; @@ -569,7 +569,7 @@ public async Task Nullable_String_Return_Configured_Null() public async Task Nullable_Parameter_Matching() { // Arrange - var mock = Mock.Of(); + var mock = INullableService.Mock(); var callCount = 0; mock.Process(IsNull(), Any()) .Callback(() => callCount++); @@ -591,7 +591,7 @@ public async Task Nullable_Parameter_Matching() public async Task Nullable_Async_Return() { // Arrange - var mock = Mock.Of(); + var mock = INullableService.Mock(); mock.FindUserAsync(Any()).Returns((UserDto?)null); INullableService svc = mock.Object; diff --git a/TUnit.Mocks.Tests/RefStructTests.cs b/TUnit.Mocks.Tests/RefStructTests.cs index 3fe98887d1..fd9095a0d6 100644 --- a/TUnit.Mocks.Tests/RefStructTests.cs +++ b/TUnit.Mocks.Tests/RefStructTests.cs @@ -31,7 +31,7 @@ public class RefStructTests public async Task Normal_Method_Returns_Configured_Value() { // Arrange - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.GetName().Returns("processor-1"); // Act @@ -49,7 +49,7 @@ public async Task Void_RefStruct_Method_Callback_Fires() { // Arrange var wasCalled = false; - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Process().Callback(() => wasCalled = true); // Act @@ -64,7 +64,7 @@ public async Task Void_RefStruct_Method_Callback_Fires() public async Task Void_RefStruct_Method_Verification_Works() { // Arrange - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); IBufferProcessor processor = mock.Object; // Act @@ -80,7 +80,7 @@ public async Task Void_RefStruct_Method_Verification_Works() public async Task Void_RefStruct_Method_Throws_Configured_Exception() { // Arrange - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Process().Throws(); // Act & Assert @@ -97,7 +97,7 @@ public async Task Void_RefStruct_Method_Throws_Configured_Exception() public async Task NonVoid_RefStruct_Param_Method_Returns_Configured_Value() { // Arrange — Parse takes ReadOnlySpan param but returns int - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Parse().Returns(42); // Act @@ -112,7 +112,7 @@ public async Task NonVoid_RefStruct_Param_Method_Returns_Configured_Value() public async Task NonVoid_RefStruct_Param_Verification() { // Arrange - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Parse().Returns(0); // Act @@ -132,7 +132,7 @@ public async Task Void_Normal_Method_Still_Works() { // Arrange var wasCalled = false; - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Clear().Callback(() => wasCalled = true); // Act @@ -151,7 +151,7 @@ public async Task Mixed_Params_ArgMatching_On_NonRefStruct_Params() { // Arrange — Compute(int id, ReadOnlySpan data) returns int // Only 'id' participates in argument matching - var mock = Mock.Of(); + var mock = IMixedProcessor.Mock(); mock.Compute(1).Returns(100); mock.Compute(2).Returns(200); @@ -171,7 +171,7 @@ public async Task Mixed_Params_ArgMatching_On_NonRefStruct_Params() public async Task Mixed_Params_Verification_With_Matcher() { // Arrange - var mock = Mock.Of(); + var mock = IMixedProcessor.Mock(); IMixedProcessor processor = mock.Object; // Act @@ -195,7 +195,7 @@ public async Task RefStructArg_Any_Matches_Void_Method() { // Arrange var wasCalled = false; - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Process(RefStructArg>.Any).Callback(() => wasCalled = true); // Act @@ -209,7 +209,7 @@ public async Task RefStructArg_Any_Matches_Void_Method() public async Task RefStructArg_Any_Matches_Return_Method() { // Arrange - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Parse(RefStructArg>.Any).Returns(99); // Act @@ -223,7 +223,7 @@ public async Task RefStructArg_Any_Matches_Return_Method() public async Task RefStructArg_Mixed_Params_Works() { // Arrange — Compute(int id, ReadOnlySpan data) - var mock = Mock.Of(); + var mock = IMixedProcessor.Mock(); mock.Compute(1, RefStructArg>.Any).Returns(100); mock.Compute(2, RefStructArg>.Any).Returns(200); @@ -240,7 +240,7 @@ public async Task RefStructArg_Mixed_Params_Works() public async Task RefStructArg_Verification_With_Any() { // Arrange - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Object.Process(new byte[] { 1, 2, 3 }); mock.Object.Process(ReadOnlySpan.Empty); @@ -253,7 +253,7 @@ public async Task RefStructArg_Verification_With_Any() public async Task RefStructArg_Mixed_Verification() { // Arrange — Send(string destination, ReadOnlySpan payload) - var mock = Mock.Of(); + var mock = IMixedProcessor.Mock(); mock.Object.Send("server-a", new byte[] { 1, 2, 3 }); mock.Object.Send("server-b", ReadOnlySpan.Empty); @@ -267,7 +267,7 @@ public async Task RefStructArg_Mixed_Verification() public async Task RefStructArg_Void_Method_Throws_Configured_Exception() { // Arrange - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Process(RefStructArg>.Any).Throws(); // Act & Assert @@ -284,7 +284,7 @@ public async Task RefStructArg_Void_Method_Throws_Configured_Exception() public async Task RefStructArg_NonVoid_Method_Returns_Configured_Value() { // Arrange — Parse takes ReadOnlySpan param but returns int - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Parse(RefStructArg>.Any).Returns(42); // Act @@ -299,7 +299,7 @@ public async Task RefStructArg_NonVoid_Method_Returns_Configured_Value() public async Task RefStructArg_NonVoid_Method_Verification() { // Arrange - var mock = Mock.Of(); + var mock = IBufferProcessor.Mock(); mock.Parse(RefStructArg>.Any).Returns(0); // Act @@ -317,7 +317,7 @@ public async Task RefStructArg_Mixed_Params_ArgMatching_On_NonRefStruct_Params() { // Arrange — Compute(int id, ReadOnlySpan data) returns int // Both params participate in matching on net9.0+ via RefStructArg.Any - var mock = Mock.Of(); + var mock = IMixedProcessor.Mock(); mock.Compute(1, RefStructArg>.Any).Returns(100); mock.Compute(2, RefStructArg>.Any).Returns(200); @@ -337,7 +337,7 @@ public async Task RefStructArg_Mixed_Params_ArgMatching_On_NonRefStruct_Params() public async Task RefStructArg_Mixed_Params_Verification_With_Matcher() { // Arrange - var mock = Mock.Of(); + var mock = IMixedProcessor.Mock(); IMixedProcessor processor = mock.Object; // Act diff --git a/TUnit.Mocks.Tests/RegexMatcherTests.cs b/TUnit.Mocks.Tests/RegexMatcherTests.cs index 3da93cc8b3..3507a46f8d 100644 --- a/TUnit.Mocks.Tests/RegexMatcherTests.cs +++ b/TUnit.Mocks.Tests/RegexMatcherTests.cs @@ -12,7 +12,7 @@ public class RegexMatcherTests public async Task Arg_Matches_With_Pattern_Matches_Matching_Strings() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Matches(@"^[A-Z]")).Returns("capitalized"); // Act @@ -27,7 +27,7 @@ public async Task Arg_Matches_With_Pattern_Matches_Matching_Strings() public async Task Arg_Matches_With_Pattern_Does_Not_Match_NonMatching() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Matches(@"^[A-Z]")).Returns("capitalized"); // Act @@ -43,7 +43,7 @@ public async Task Arg_Matches_With_Regex_Object() { // Arrange var regex = new Regex(@"\d{3}-\d{4}", RegexOptions.Compiled); - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Matches(regex)).Returns("phone"); // Act @@ -58,7 +58,7 @@ public async Task Arg_Matches_With_Regex_Object() public async Task Arg_Matches_Regex_Does_Not_Match_Null() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Matches(".*")).Returns("matched"); // Act @@ -72,7 +72,7 @@ public async Task Arg_Matches_Regex_Does_Not_Match_Null() public async Task Arg_Matches_Regex_With_Email_Pattern() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Matches(@"^[\w.+-]+@[\w-]+\.[\w.]+$")).Returns("email"); // Act diff --git a/TUnit.Mocks.Tests/ResetTests.cs b/TUnit.Mocks.Tests/ResetTests.cs index 7d1cc18f02..ee246e757f 100644 --- a/TUnit.Mocks.Tests/ResetTests.cs +++ b/TUnit.Mocks.Tests/ResetTests.cs @@ -14,7 +14,7 @@ public class ResetTests public async Task Reset_Clears_All_Setups() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(42); mock.Add(3, 4).Returns(99); @@ -34,7 +34,7 @@ public async Task Reset_Clears_All_Setups() public async Task Reset_Clears_Call_History() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); calc.Add(3, 4); @@ -55,7 +55,7 @@ public async Task Reset_Clears_Call_History() public async Task Reset_Allows_Fresh_Setup() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(42); ICalculator calc = mock.Object; @@ -73,7 +73,7 @@ public async Task Reset_Allows_Fresh_Setup() public async Task Reset_Allows_Fresh_Verification() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); calc.Add(1, 2); @@ -95,7 +95,7 @@ public async Task Reset_Allows_Fresh_Verification() public async Task Reset_On_Strict_Mock_Restores_Strict_Behavior() { // Arrange — strict mock with a configured method - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); mock.Add(1, 2).Returns(3); ICalculator calc = mock.Object; @@ -118,7 +118,7 @@ public async Task Reset_On_Strict_Mock_Restores_Strict_Behavior() public async Task Reset_Clears_String_Method_Setup() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet("Alice").Returns("Hello, Alice!"); IGreeter greeter = mock.Object; @@ -136,7 +136,7 @@ public async Task Reset_Clears_String_Method_Setup() public async Task Reset_Clears_Void_Method_Call_History() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Log("message1"); calc.Log("message2"); @@ -155,7 +155,7 @@ public async Task Reset_Clears_Void_Method_Call_History() public async Task Reset_Followed_By_New_Setup_And_Verification() { // Arrange — full lifecycle: setup, use, reset, re-setup, re-use, re-verify - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 1).Returns(10); ICalculator calc = mock.Object; @@ -182,7 +182,7 @@ public async Task Reset_Followed_By_New_Setup_And_Verification() public async Task Multiple_Resets() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // First cycle diff --git a/TUnit.Mocks.Tests/SequentialBehaviorTests.cs b/TUnit.Mocks.Tests/SequentialBehaviorTests.cs index 14956c1f5f..52bab9c7e0 100644 --- a/TUnit.Mocks.Tests/SequentialBehaviorTests.cs +++ b/TUnit.Mocks.Tests/SequentialBehaviorTests.cs @@ -12,7 +12,7 @@ public class SequentialBehaviorTests public async Task Throws_Then_Returns_First_Call_Throws_Second_Returns() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Throws() .Then() @@ -33,7 +33,7 @@ public async Task Throws_Then_Returns_First_Call_Throws_Second_Returns() public async Task ReturnsSequentially_Returns_Values_In_Order() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .ReturnsSequentially(1, 2, 3); @@ -49,7 +49,7 @@ public async Task ReturnsSequentially_Returns_Values_In_Order() public async Task ReturnsSequentially_Last_Value_Repeats() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .ReturnsSequentially(10, 20); @@ -67,7 +67,7 @@ public async Task Void_Method_Callback_Then_Throws() { // Arrange var callbackInvoked = false; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Log(Any()) .Callback(() => callbackInvoked = true) .Then() @@ -88,7 +88,7 @@ public async Task Void_Method_Callback_Then_Throws() public async Task Returns_Then_Throws_Sequence() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 1) .Returns(42) .Then() @@ -108,7 +108,7 @@ public async Task Returns_Then_Throws_Sequence() public async Task Void_Returns_Then_Throws_Then_Returns() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Log(Any()) .Returns() .Then() @@ -139,7 +139,7 @@ public async Task Void_Returns_Then_Throws_Then_Returns() public async Task Chained_Returns_With_Then() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Any()) .Returns("first") .Then() diff --git a/TUnit.Mocks.Tests/SmartDefaultTests.cs b/TUnit.Mocks.Tests/SmartDefaultTests.cs index 06ffef5b8f..9a0d8eaf2c 100644 --- a/TUnit.Mocks.Tests/SmartDefaultTests.cs +++ b/TUnit.Mocks.Tests/SmartDefaultTests.cs @@ -25,7 +25,7 @@ public class SmartDefaultTests public async Task Unconfigured_String_Returns_Empty_String() { // Arrange - var mock = Mock.Of(); + var mock = IDefaultsService.Mock(); // Act IDefaultsService svc = mock.Object; @@ -40,7 +40,7 @@ public async Task Unconfigured_String_Returns_Empty_String() public async Task Unconfigured_Int_Returns_Zero() { // Arrange - var mock = Mock.Of(); + var mock = IDefaultsService.Mock(); // Act IDefaultsService svc = mock.Object; @@ -54,7 +54,7 @@ public async Task Unconfigured_Int_Returns_Zero() public async Task Unconfigured_Bool_Returns_False() { // Arrange - var mock = Mock.Of(); + var mock = IDefaultsService.Mock(); // Act IDefaultsService svc = mock.Object; @@ -68,7 +68,7 @@ public async Task Unconfigured_Bool_Returns_False() public async Task Unconfigured_Nullable_Returns_Null() { // Arrange - var mock = Mock.Of(); + var mock = IDefaultsService.Mock(); // Act IDefaultsService svc = mock.Object; @@ -82,7 +82,7 @@ public async Task Unconfigured_Nullable_Returns_Null() public async Task Unconfigured_List_Returns_Empty_Collection() { // Arrange - var mock = Mock.Of(); + var mock = IDefaultsService.Mock(); // Act IDefaultsService svc = mock.Object; @@ -97,7 +97,7 @@ public async Task Unconfigured_List_Returns_Empty_Collection() public async Task Unconfigured_Double_Returns_Zero() { // Arrange - var mock = Mock.Of(); + var mock = IDefaultsService.Mock(); // Act IDefaultsService svc = mock.Object; @@ -111,7 +111,7 @@ public async Task Unconfigured_Double_Returns_Zero() public async Task Unconfigured_Long_Returns_Zero() { // Arrange - var mock = Mock.Of(); + var mock = IDefaultsService.Mock(); // Act IDefaultsService svc = mock.Object; @@ -125,7 +125,7 @@ public async Task Unconfigured_Long_Returns_Zero() public async Task Configured_Overrides_Smart_Default() { // Arrange - var mock = Mock.Of(); + var mock = IDefaultsService.Mock(); mock.GetName().Returns("custom"); mock.GetCount().Returns(42); @@ -141,7 +141,7 @@ public async Task Configured_Overrides_Smart_Default() public async Task Smart_Defaults_Consistent_With_ICalculator() { // Verify that the existing ICalculator interface also has correct smart defaults - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // int -> 0 diff --git a/TUnit.Mocks.Tests/SpanReturnTests.cs b/TUnit.Mocks.Tests/SpanReturnTests.cs index 5bb0429f61..4641821e63 100644 --- a/TUnit.Mocks.Tests/SpanReturnTests.cs +++ b/TUnit.Mocks.Tests/SpanReturnTests.cs @@ -24,7 +24,7 @@ public class SpanReturnTests [Test] public async Task Returns_ReadOnlySpan_Byte_With_Data() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes().Returns(new ReadOnlySpan([1, 2, 3])); var result = mock.Object.GetBytes(); @@ -42,7 +42,7 @@ public async Task Returns_ReadOnlySpan_Byte_With_Data() [Test] public async Task Returns_ReadOnlySpan_Byte_Empty() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes().Returns(ReadOnlySpan.Empty); var result = mock.Object.GetBytes(); @@ -55,7 +55,7 @@ public async Task Returns_ReadOnlySpan_Byte_Empty() public async Task Returns_ReadOnlySpan_No_Setup_Returns_Default() { // No .Returns() call — should return empty span (default) - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); var result = mock.Object.GetBytes(); var len = result.Length; @@ -66,7 +66,7 @@ public async Task Returns_ReadOnlySpan_No_Setup_Returns_Default() [Test] public async Task Returns_ReadOnlySpan_With_Arg_Matching() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes("hello").Returns(new ReadOnlySpan([0xCA, 0xFE])); mock.GetBytes("world").Returns(new ReadOnlySpan([0xDE, 0xAD])); @@ -92,7 +92,7 @@ public async Task Returns_ReadOnlySpan_With_Arg_Matching() [Test] public async Task Returns_ReadOnlySpan_With_Arg_Any() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes(Any()).Returns(new ReadOnlySpan([0xFF])); var result = mock.Object.GetBytes("anything"); @@ -106,7 +106,7 @@ public async Task Returns_ReadOnlySpan_With_Arg_Any() [Test] public async Task Returns_ReadOnlySpan_Char() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetChars(42).Returns(new ReadOnlySpan(['a', 'b', 'c'])); var result = mock.Object.GetChars(42); @@ -124,7 +124,7 @@ public async Task Returns_ReadOnlySpan_Char() [Test] public async Task Returns_Mutable_Span() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetMutableBuffer().Returns(new Span([10, 20, 30])); var result = mock.Object.GetMutableBuffer(); @@ -142,7 +142,7 @@ public async Task Returns_Mutable_Span() [Test] public void Span_Return_Throws_Exception() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes().Throws(); Assert.Throws(() => mock.Object.GetBytes()); @@ -152,7 +152,7 @@ public void Span_Return_Throws_Exception() public async Task Span_Return_Callback_Is_Invoked() { var wasCalled = false; - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes().Callback(() => wasCalled = true) .Returns(new ReadOnlySpan([1])); @@ -164,7 +164,7 @@ public async Task Span_Return_Callback_Is_Invoked() [Test] public async Task Span_Return_Verify_WasCalled() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes().Returns(new ReadOnlySpan([1])); mock.Object.GetBytes(); @@ -177,7 +177,7 @@ public async Task Span_Return_Verify_WasCalled() [Test] public async Task Span_Return_Verify_WasNeverCalled() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes().WasNeverCalled(); await Assert.That(true).IsTrue(); @@ -186,7 +186,7 @@ public async Task Span_Return_Verify_WasNeverCalled() [Test] public async Task Span_Return_Verify_With_Specific_Args() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes(Any()).Returns(new ReadOnlySpan([1])); mock.Object.GetBytes("hello"); @@ -205,7 +205,7 @@ public async Task Span_Return_Large_Data() for (int i = 0; i < largeData.Length; i++) largeData[i] = (byte)(i % 256); - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes().Returns(new ReadOnlySpan(largeData)); var result = mock.Object.GetBytes(); @@ -221,7 +221,7 @@ public async Task Span_Return_Large_Data() [Test] public async Task Span_Return_Unmatched_Args_Returns_Default() { - var mock = Mock.Of(); + var mock = ISpanProducer.Mock(); mock.GetBytes("specific").Returns(new ReadOnlySpan([1, 2, 3])); // Call with different arg — should return default (empty span) diff --git a/TUnit.Mocks.Tests/StateMachineTests.cs b/TUnit.Mocks.Tests/StateMachineTests.cs index f392f9ca97..de0f87051c 100644 --- a/TUnit.Mocks.Tests/StateMachineTests.cs +++ b/TUnit.Mocks.Tests/StateMachineTests.cs @@ -14,7 +14,7 @@ public class StateMachineTests [Test] public async Task State_Machine_Returns_Different_Values_Per_State() { - var mock = Mock.Of(); + var mock = IConnection.Mock(); mock.SetState("disconnected"); mock.InState("disconnected", m => @@ -41,7 +41,7 @@ public async Task State_Machine_Returns_Different_Values_Per_State() [Test] public async Task TransitionsTo_Changes_State_After_Call() { - var mock = Mock.Of(); + var mock = IConnection.Mock(); mock.SetState("disconnected"); mock.InState("disconnected", m => @@ -70,7 +70,7 @@ public async Task TransitionsTo_Changes_State_After_Call() [Test] public async Task State_Scoped_Throws() { - var mock = Mock.Of(); + var mock = IConnection.Mock(); mock.SetState("connected"); mock.InState("connected", m => @@ -96,7 +96,7 @@ public async Task State_Scoped_Throws() [Test] public async Task No_State_Setups_Match_In_Any_State() { - var mock = Mock.Of(); + var mock = IConnection.Mock(); mock.SetState("disconnected"); // Setup without state guard — matches in any state @@ -115,7 +115,7 @@ public async Task No_State_Setups_Match_In_Any_State() [Test] public async Task State_Scoped_Setup_Overrides_Global_When_In_State() { - var mock = Mock.Of(); + var mock = IConnection.Mock(); // Global setup (no state guard) mock.GetStatus().Returns("DEFAULT"); @@ -143,7 +143,7 @@ public async Task State_Scoped_Setup_Overrides_Global_When_In_State() [Test] public async Task Strict_Mode_Throws_For_Unconfigured_Call_In_State() { - var mock = Mock.Of(MockBehavior.Strict); + var mock = IConnection.Mock(MockBehavior.Strict); mock.SetState("disconnected"); mock.InState("disconnected", m => @@ -162,7 +162,7 @@ public async Task Strict_Mode_Throws_For_Unconfigured_Call_In_State() public async Task Nested_InState_Restores_Previous_State_Scope() { // Regression test: nested InState calls must save/restore PendingRequiredState - var mock = Mock.Of(); + var mock = IConnection.Mock(); mock.SetState("outer"); mock.InState("outer", m => @@ -193,7 +193,7 @@ public async Task Nested_InState_Restores_Previous_State_Scope() [Test] public async Task SetState_Null_Clears_State() { - var mock = Mock.Of(); + var mock = IConnection.Mock(); // Global (no-state) setup — added first mock.GetStatus().Returns("NO_STATE"); @@ -217,7 +217,7 @@ public async Task SetState_Null_Clears_State() [Test] public async Task Reset_Clears_State() { - var mock = Mock.Of(); + var mock = IConnection.Mock(); mock.SetState("connected"); mock.Reset(); @@ -229,7 +229,7 @@ public async Task Reset_Clears_State() [Test] public async Task Verify_Works_With_State_Scoped_Setups() { - var mock = Mock.Of(); + var mock = IConnection.Mock(); mock.SetState("disconnected"); mock.InState("disconnected", m => diff --git a/TUnit.Mocks.Tests/StaticAbstractMemberTests.cs b/TUnit.Mocks.Tests/StaticAbstractMemberTests.cs index cd7da06cb5..42ec870ae7 100644 --- a/TUnit.Mocks.Tests/StaticAbstractMemberTests.cs +++ b/TUnit.Mocks.Tests/StaticAbstractMemberTests.cs @@ -66,7 +66,7 @@ public class StaticAbstractMemberTests public async Task Static_Abstract_Method_Returns_Configured_Value() { // Arrange — use the bridge type which resolves static abstract members - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); var expectedConfig = new ClientConfig { Region = "eu-west-1" }; mock.CreateDefaultConfig().Returns(expectedConfig); @@ -81,7 +81,7 @@ public async Task Static_Abstract_Method_Returns_Configured_Value() public async Task Static_Abstract_Method_Returns_Default_When_No_Setup() { // Arrange - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); // Act — no setup, should return default var result = CallStaticAbstract(); @@ -94,7 +94,7 @@ public async Task Static_Abstract_Method_Returns_Default_When_No_Setup() public async Task Static_Abstract_Method_Throws_Configured_Exception() { // Arrange - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); mock.CreateDefaultConfig().Throws(new InvalidOperationException("not available")); // Act & Assert @@ -107,7 +107,7 @@ await Assert.That(() => CallStaticAbstract()) public async Task Static_Abstract_Method_Verification() { // Arrange - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); mock.CreateDefaultConfig().Returns(new ClientConfig()); // Act @@ -122,7 +122,7 @@ public async Task Static_Abstract_Method_Verification() public async Task Static_Abstract_Property_Getter_Returns_Configured_Value() { // Arrange - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); mock.ServiceId.Getter.Returns("s3"); // Act @@ -136,7 +136,7 @@ public async Task Static_Abstract_Property_Getter_Returns_Configured_Value() public async Task Static_Abstract_Property_Setter_Can_Be_Verified() { // Arrange - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); // Act SetStaticAbstractProperty("dynamodb"); @@ -149,7 +149,7 @@ public async Task Static_Abstract_Property_Setter_Can_Be_Verified() public async Task Instance_And_Static_Members_Coexist() { // Arrange - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); mock.GetEndpoint().Returns("https://s3.amazonaws.com"); mock.CreateDefaultConfig().Returns(new ClientConfig { Region = "ap-southeast-1" }); @@ -167,7 +167,7 @@ public async Task Instance_And_Static_Members_Coexist() [Test] public async Task Static_Abstract_CreateDefaultClientConfig_Returns_Configured_Value() { - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); var expected = new ClientConfig { Region = "sa-east-1" }; mock.CreateDefaultClientConfig().Returns(expected); @@ -179,7 +179,7 @@ public async Task Static_Abstract_CreateDefaultClientConfig_Returns_Configured_V [Test] public async Task Static_Abstract_CreateDefaultClientConfig_Verification() { - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); mock.CreateDefaultClientConfig().Returns(new ClientConfig()); CallCreateDefaultClientConfig(); @@ -195,7 +195,7 @@ public async Task Static_Abstract_CreateDefaultServiceClient_Returns_Null_By_Def { // No setup — the generator uses HandleCallWithReturn + cast, // so the default null value is cast to IAmazonService and returned. - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); var result = CallCreateDefaultServiceClient( new AWSCredentials(), new ClientConfig()); @@ -209,7 +209,7 @@ public async Task Static_Abstract_CreateDefaultServiceClient_Returns_Configured_ { // Arrange — .Returns() works via MockMethodCall (not VoidMockMethodCall) // because the return type (IAmazonService) has static abstract members (CS8920). - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); var expectedService = mock.Object; mock.CreateDefaultServiceClient(Arg.Any(), Arg.Any()) .Returns(expectedService); @@ -225,7 +225,7 @@ public async Task Static_Abstract_CreateDefaultServiceClient_Returns_Configured_ [Test] public async Task Static_Abstract_CreateDefaultServiceClient_Verification() { - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); var creds = new AWSCredentials { AccessKey = "AKID", AuthSignature = "test-sig" }; var config = new ClientConfig { Region = "us-west-2" }; @@ -239,7 +239,7 @@ public async Task Static_Abstract_CreateDefaultServiceClient_Verification() [Test] public async Task Static_Abstract_CreateDefaultServiceClient_Throws_Configured_Exception() { - var mock = Mock.Of(); + var mock = IAmazonServiceMockable.Mock(); mock.CreateDefaultServiceClient(Arg.Any(), Arg.Any()) .Throws(new InvalidOperationException("service unavailable")); diff --git a/TUnit.Mocks.Tests/StrictModeTests.cs b/TUnit.Mocks.Tests/StrictModeTests.cs index 336674622a..8e0d968c35 100644 --- a/TUnit.Mocks.Tests/StrictModeTests.cs +++ b/TUnit.Mocks.Tests/StrictModeTests.cs @@ -12,7 +12,7 @@ public class StrictModeTests public async Task Strict_Unconfigured_Void_Method_Throws() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert — unconfigured void method should throw @@ -28,7 +28,7 @@ public async Task Strict_Unconfigured_Void_Method_Throws() public async Task Strict_Unconfigured_Return_Method_Throws() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert — unconfigured return method should throw @@ -44,7 +44,7 @@ public async Task Strict_Unconfigured_Return_Method_Throws() public async Task Strict_Configured_Method_Works_Normally() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); mock.Add(2, 3).Returns(5); // Act @@ -59,7 +59,7 @@ public async Task Strict_Configured_Method_Works_Normally() public async Task Strict_Configured_Void_Method_Does_Not_Throw() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); mock.Log("expected message"); // Act & Assert — configured void method should not throw @@ -72,7 +72,7 @@ public async Task Strict_Configured_Void_Method_Does_Not_Throw() public async Task Strict_Error_Message_Contains_Method_Name() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert @@ -88,7 +88,7 @@ public async Task Strict_Error_Message_Contains_Method_Name() public async Task Strict_Error_Message_Contains_Arguments() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert @@ -105,7 +105,7 @@ public async Task Strict_Error_Message_Contains_Arguments() public async Task Strict_Error_Message_Contains_String_Arguments() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = IGreeter.Mock(MockBehavior.Strict); IGreeter greeter = mock.Object; // Act & Assert @@ -122,7 +122,7 @@ public async Task Strict_Error_Message_Contains_String_Arguments() public async Task Strict_Mixed_Some_Configured_Some_Not() { // Arrange — configure Add but not Log or GetName - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); mock.Add(1, 2).Returns(3); ICalculator calc = mock.Object; @@ -150,7 +150,7 @@ public async Task Strict_Mixed_Some_Configured_Some_Not() public async Task Strict_Configured_Args_Mismatch_Throws() { // Arrange — configure Add with specific args - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); mock.Add(1, 2).Returns(3); ICalculator calc = mock.Object; @@ -170,7 +170,7 @@ public async Task Strict_Configured_Args_Mismatch_Throws() public async Task Strict_UnconfiguredCall_Property_Contains_Call_Info() { // Arrange - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); ICalculator calc = mock.Object; // Act & Assert @@ -188,7 +188,7 @@ public async Task Strict_UnconfiguredCall_Property_Contains_Call_Info() public async Task Loose_Is_Default_Behavior() { // Arrange — no behavior specified, should be Loose - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — unconfigured methods should NOT throw ICalculator calc = mock.Object; diff --git a/TUnit.Mocks.Tests/ThreadSafetyTests.cs b/TUnit.Mocks.Tests/ThreadSafetyTests.cs index 37800ad981..81888c93b4 100644 --- a/TUnit.Mocks.Tests/ThreadSafetyTests.cs +++ b/TUnit.Mocks.Tests/ThreadSafetyTests.cs @@ -12,7 +12,7 @@ public class ThreadSafetyTests public async Task Concurrent_Calls_Are_Thread_Safe() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -32,7 +32,7 @@ public async Task Concurrent_Calls_Are_Thread_Safe() public async Task Concurrent_Void_Calls_Are_Thread_Safe() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — 100 concurrent void calls @@ -48,7 +48,7 @@ public async Task Concurrent_Void_Calls_Are_Thread_Safe() public async Task Concurrent_Setup_And_Call() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — one thread adds setups, others call methods simultaneously @@ -78,7 +78,7 @@ public async Task Concurrent_Setup_And_Call() public async Task Concurrent_Calls_With_Different_Args() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 1).Returns(10); mock.Add(2, 2).Returns(20); mock.Add(3, 3).Returns(30); @@ -104,7 +104,7 @@ public async Task Concurrent_Calls_With_Different_Args() public async Task Concurrent_Verification_Is_Thread_Safe() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; // Act — make some calls first @@ -129,11 +129,11 @@ public async Task Concurrent_Verification_Is_Thread_Safe() public async Task Concurrent_Calls_On_Different_Interfaces() { // Arrange - var calcMock = Mock.Of(); + var calcMock = ICalculator.Mock(); calcMock.Add(Any(), Any()).Returns(99); ICalculator calc = calcMock.Object; - var greeterMock = Mock.Of(); + var greeterMock = IGreeter.Mock(); greeterMock.Greet(Any()).Returns("hi"); IGreeter greeter = greeterMock.Object; @@ -163,7 +163,7 @@ public async Task Concurrent_Calls_On_Different_Interfaces() public async Task Concurrent_Calls_All_Recorded_In_History() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Any()).Returns("hello"); IGreeter greeter = mock.Object; diff --git a/TUnit.Mocks.Tests/TypedCallbackTests.cs b/TUnit.Mocks.Tests/TypedCallbackTests.cs index 2b2396ca1a..bfff6a4008 100644 --- a/TUnit.Mocks.Tests/TypedCallbackTests.cs +++ b/TUnit.Mocks.Tests/TypedCallbackTests.cs @@ -13,7 +13,7 @@ public async Task Callback_With_Args_Receives_Arguments() { // Arrange (int a, int b)? capturedArgs = null; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Callback((int a, int b) => capturedArgs = (a, b)); @@ -33,7 +33,7 @@ public async Task Callback_With_Args_On_Void_Method() { // Arrange string? capturedMsg = null; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Log(Any()) .Callback((string msg) => capturedMsg = msg); @@ -50,7 +50,7 @@ public async Task Callback_With_Args_On_Void_Method() public async Task Returns_With_Args_Computes_From_Arguments() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Returns((int a, int b) => a + b); @@ -66,7 +66,7 @@ public async Task Returns_With_Args_Computes_From_Arguments() public async Task Returns_With_Args_String_Concatenation() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Any()) .Returns((string name) => $"Hello, {name}!"); @@ -81,7 +81,7 @@ public async Task Returns_With_Args_String_Concatenation() public async Task Computed_Throw_With_Args() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Throws((int a, int b) => new ArgumentException($"Bad args: {a}, {b}")); @@ -97,7 +97,7 @@ public async Task Computed_Throw_With_Args() public async Task Computed_Throw_On_Void_Method() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Log(Any()) .Throws((string msg) => new InvalidOperationException($"Cannot log: {msg}")); @@ -114,7 +114,7 @@ public async Task Callback_With_Args_Then_Returns() { // Arrange (int a, int b)? capturedArgs = null; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Callback((int a, int b) => capturedArgs = (a, b)) .Then() @@ -136,7 +136,7 @@ public async Task Callback_With_Args_Then_Returns() public async Task Returns_With_Args_Repeats_On_Subsequent_Calls() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Returns((int a, int b) => a * b); @@ -153,7 +153,7 @@ public async Task Returns_With_Args_Repeats_On_Subsequent_Calls() [Test] public async Task StronglyTyped_Returns_Computes_From_Arguments() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns((int a, int b) => a + b); ICalculator calc = mock.Object; @@ -165,7 +165,7 @@ public async Task StronglyTyped_Returns_Computes_From_Arguments() [Test] public async Task StronglyTyped_Callback_Receives_Arguments() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); var capturedArgs = new List<(int a, int b)>(); // Callback is a behavior — first call runs callback, second call runs Returns @@ -185,7 +185,7 @@ public async Task StronglyTyped_Callback_Receives_Arguments() [Test] public async Task StronglyTyped_Throws_With_Argument_Dependent_Exception() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Throws((int a, int b) => new ArgumentException($"Cannot add {a} and {b}")); @@ -198,7 +198,7 @@ public async Task StronglyTyped_Throws_With_Argument_Dependent_Exception() [Test] public async Task StronglyTyped_Void_Callback() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); string? capturedMessage = null; mock.Log(Any()) @@ -213,7 +213,7 @@ public async Task StronglyTyped_Void_Callback() [Test] public async Task StronglyTyped_Void_Throws() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Log(Any()) .Throws((string msg) => new InvalidOperationException($"Cannot log: {msg}")); @@ -226,7 +226,7 @@ public async Task StronglyTyped_Void_Throws() [Test] public async Task StronglyTyped_Returns_Single_Parameter() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Any()).Returns((string name) => $"Hello, {name}!"); IGreeter greeter = mock.Object; @@ -237,7 +237,7 @@ public async Task StronglyTyped_Returns_Single_Parameter() [Test] public async Task StronglyTyped_With_Then_Chain() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Returns((int a, int b) => a + b) .Then() @@ -253,7 +253,7 @@ public async Task StronglyTyped_With_Then_Chain() public async Task StronglyTyped_Existing_Untyped_Returns_Still_Works() { // Verify that existing untyped API still compiles and works - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); ICalculator calc = mock.Object; @@ -264,7 +264,7 @@ public async Task StronglyTyped_Existing_Untyped_Returns_Still_Works() [Test] public async Task StronglyTyped_Existing_Untyped_Callback_Still_Works() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); var called = false; mock.Add(Any(), Any()) .Callback(() => called = true) diff --git a/TUnit.Mocks.Tests/UntypedAnyTests.cs b/TUnit.Mocks.Tests/UntypedAnyTests.cs index 9adcacd343..e2c5b54de3 100644 --- a/TUnit.Mocks.Tests/UntypedAnyTests.cs +++ b/TUnit.Mocks.Tests/UntypedAnyTests.cs @@ -17,7 +17,7 @@ public class UntypedAnyTests [Test] public async Task Any_Converts_To_Int_And_Matches_All() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(42); await Assert.That(mock.Object.Add(0, 0)).IsEqualTo(42); @@ -29,7 +29,7 @@ public async Task Any_Converts_To_Int_And_Matches_All() [Test] public async Task Any_Converts_To_Bool() { - var mock = Mock.Of(); + var mock = IOverloadedService.Mock(); mock.Process(Any(), Any()).Callback(() => { }); // Should not throw — Any() converts to Arg @@ -42,7 +42,7 @@ public async Task Any_Converts_To_Bool() [Test] public async Task Any_Converts_To_Double() { - var mock = Mock.Of(); + var mock = IOverloadedService.Mock(); mock.Format(Any(), Any()).Returns("ok"); await Assert.That(mock.Object.Format(3.14, 2)).IsEqualTo("ok"); @@ -53,7 +53,7 @@ public async Task Any_Converts_To_Double() [Test] public async Task Any_Converts_To_Enum() { - var mock = Mock.Of(); + var mock = ITaskManager.Mock(); mock.CountByStatusAsync(Any()).Returns(99); await Assert.That(await mock.Object.CountByStatusAsync(Status.Active)).IsEqualTo(99); @@ -69,7 +69,7 @@ public async Task Any_Converts_To_Enum() [Test] public async Task Any_Converts_To_String() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Any()).Returns("hello"); await Assert.That(mock.Object.Greet("Alice")).IsEqualTo("hello"); @@ -79,7 +79,7 @@ public async Task Any_Converts_To_String() [Test] public async Task Any_Converts_To_String_And_Matches_Null() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Any()).Returns("matched"); await Assert.That(mock.Object.Greet(null!)).IsEqualTo("matched"); @@ -88,7 +88,7 @@ public async Task Any_Converts_To_String_And_Matches_Null() [Test] public async Task Any_Converts_To_Array() { - var mock = Mock.Of(); + var mock = IComplexOperations.Mock(); mock.BuildQuery( Any(), Any(), Any(), Any(), Any(), Any(), Any() ).Returns("query"); @@ -105,7 +105,7 @@ public async Task Any_Converts_To_Array() [Test] public async Task Any_Converts_To_Nullable_String() { - var mock = Mock.Of(); + var mock = INullableService.Mock(); mock.Process(Any(), Any()).Callback(() => { }); // Both null and non-null should match @@ -118,7 +118,7 @@ public async Task Any_Converts_To_Nullable_String() [Test] public async Task Any_Converts_To_Nullable_Int() { - var mock = Mock.Of(); + var mock = IComplexOperations.Mock(); mock.BuildQuery("t", Any(), Any(), Any(), Any(), Any(), Any()).Returns("ok"); // Nullable int? params (limit, offset) accept both null and values @@ -133,7 +133,7 @@ public async Task Any_Converts_To_Nullable_Int() [Test] public async Task Any_Mixed_With_Exact_Value() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), 5).Returns(50); await Assert.That(mock.Object.Add(0, 5)).IsEqualTo(50); @@ -144,7 +144,7 @@ public async Task Any_Mixed_With_Exact_Value() [Test] public async Task Any_Mixed_With_Typed_Any() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(77); await Assert.That(mock.Object.Add(1, 2)).IsEqualTo(77); @@ -154,7 +154,7 @@ public async Task Any_Mixed_With_Typed_Any() [Test] public async Task Any_Mixed_With_Predicate_Matcher() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Is(x => x > 0)).Returns(100); await Assert.That(mock.Object.Add(0, 1)).IsEqualTo(100); @@ -165,7 +165,7 @@ public async Task Any_Mixed_With_Predicate_Matcher() [Test] public async Task Any_Mixed_With_IsNull_Matcher() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(IsNull()).Returns("was null"); mock.Greet(Any()).Returns("catch-all"); @@ -181,7 +181,7 @@ public async Task Any_Mixed_With_IsNull_Matcher() [Test] public async Task Any_Works_In_Verification() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Returns(1); mock.Object.Add(1, 2); @@ -194,7 +194,7 @@ public async Task Any_Works_In_Verification() [Test] public async Task Any_WasNeverCalled_Verification() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).WasNeverCalled(); } @@ -202,7 +202,7 @@ public async Task Any_WasNeverCalled_Verification() [Test] public async Task Any_Verification_On_Void_Method() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Object.Log("hello"); mock.Object.Log("world"); @@ -217,7 +217,7 @@ public async Task Any_Verification_On_Void_Method() [Test] public async Task Any_With_Throws() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()).Throws(); await Assert.That(() => mock.Object.Add(1, 2)).Throws(); @@ -227,7 +227,7 @@ public async Task Any_With_Throws() public async Task Any_With_Callback() { var callCount = 0; - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(Any(), Any()) .Callback(() => callCount++); @@ -240,7 +240,7 @@ public async Task Any_With_Callback() [Test] public async Task Any_With_Sequential_Returns() { - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet(Any()) .Returns("first") .Then() @@ -258,7 +258,7 @@ public async Task Any_With_Sequential_Returns() [Test] public async Task Any_All_Seven_Params() { - var mock = Mock.Of(); + var mock = IComplexOperations.Mock(); mock.BuildQuery(Any(), Any(), Any(), Any(), Any(), Any(), Any()) .Returns("wildcard"); @@ -274,7 +274,7 @@ public async Task Any_All_Seven_Params() [Test] public async Task Any_With_Async_Method() { - var mock = Mock.Of(); + var mock = IAsyncService.Mock(); mock.GetNameAsync(Any()).Returns("async-result"); var result = await mock.Object.GetNameAsync("key"); @@ -291,7 +291,7 @@ public async Task Typed_Any_Captures_But_Untyped_Does_Not_Have_Values() { // Typed Any() supports capture var typedArg = Any(); - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(typedArg, Any()).Returns(1); mock.Object.Add(10, 0); @@ -313,7 +313,7 @@ public async Task Typed_Any_Captures_But_Untyped_Does_Not_Have_Values() [Test] public async Task Typed_Any_Disambiguates_Overloads() { - var mock = Mock.Of(); + var mock = IOverloadedService.Mock(); mock.Format(Any()).Returns("int-match"); mock.Format(Any()).Returns("str-match"); @@ -328,7 +328,7 @@ public async Task Typed_Any_Disambiguates_Overloads() [Test] public async Task Any_Without_Setup_Returns_Default_In_Loose_Mode() { - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // No setup — loose mode returns defaults await Assert.That(mock.Object.Add(1, 2)).IsEqualTo(0); @@ -338,7 +338,7 @@ public async Task Any_Without_Setup_Returns_Default_In_Loose_Mode() [Test] public async Task Any_In_Strict_Mode_Allows_Configured_Calls() { - var mock = Mock.Of(MockBehavior.Strict); + var mock = ICalculator.Mock(MockBehavior.Strict); mock.Add(Any(), Any()).Returns(42); await Assert.That(mock.Object.Add(1, 2)).IsEqualTo(42); diff --git a/TUnit.Mocks.Tests/VerificationMessageTests.cs b/TUnit.Mocks.Tests/VerificationMessageTests.cs index 5c69116a26..4d79ffec3b 100644 --- a/TUnit.Mocks.Tests/VerificationMessageTests.cs +++ b/TUnit.Mocks.Tests/VerificationMessageTests.cs @@ -13,7 +13,7 @@ public class VerificationMessageTests public async Task WasCalled_With_Custom_Message_Includes_It() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — call once ICalculator calc = mock.Object; @@ -33,7 +33,7 @@ public async Task WasCalled_With_Custom_Message_Includes_It() public async Task WasNeverCalled_With_Custom_Message_Includes_It() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); ICalculator calc = mock.Object; calc.Add(1, 2); @@ -51,7 +51,7 @@ public async Task WasNeverCalled_With_Custom_Message_Includes_It() public async Task WasCalled_Shorthand_With_Custom_Message_Includes_It() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Assert — not called at all var ex = Assert.Throws(() => @@ -67,7 +67,7 @@ public async Task WasCalled_Shorthand_With_Custom_Message_Includes_It() public async Task WasCalled_Without_Message_Has_Standard_Output() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Assert var ex = Assert.Throws(() => @@ -83,7 +83,7 @@ public async Task WasCalled_Without_Message_Has_Standard_Output() public async Task WasCalled_With_Null_Message_Has_Standard_Output() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Assert var ex = Assert.Throws(() => @@ -98,7 +98,7 @@ public async Task WasCalled_With_Null_Message_Has_Standard_Output() public async Task WasCalled_With_Empty_Message_Has_Standard_Output() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Assert var ex = Assert.Throws(() => diff --git a/TUnit.Mocks.Tests/VerificationTests.cs b/TUnit.Mocks.Tests/VerificationTests.cs index 8863bd2747..e2f808d28d 100644 --- a/TUnit.Mocks.Tests/VerificationTests.cs +++ b/TUnit.Mocks.Tests/VerificationTests.cs @@ -13,7 +13,7 @@ public class VerificationTests public async Task Verify_Once_Succeeds_When_Called_Once() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); mock.Add(1, 2).Returns(3); // Act @@ -29,7 +29,7 @@ public async Task Verify_Once_Succeeds_When_Called_Once() public async Task Verify_Fails_With_Descriptive_Message_When_Count_Wrong() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — call once ICalculator calc = mock.Object; @@ -50,7 +50,7 @@ public async Task Verify_Fails_With_Descriptive_Message_When_Count_Wrong() public async Task Verify_Never_Succeeds_When_Not_Called() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — don't call anything @@ -63,7 +63,7 @@ public async Task Verify_Never_Succeeds_When_Not_Called() public async Task Verify_Never_Fails_When_Called() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act ICalculator calc = mock.Object; @@ -82,7 +82,7 @@ public async Task Verify_Never_Fails_When_Called() public async Task Verify_AtLeast_Succeeds() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — call 3 times ICalculator calc = mock.Object; @@ -99,7 +99,7 @@ public async Task Verify_AtLeast_Succeeds() public async Task Verify_AtMost_Succeeds() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — call twice ICalculator calc = mock.Object; @@ -115,7 +115,7 @@ public async Task Verify_AtMost_Succeeds() public async Task Verify_AtMost_Fails_When_Exceeded() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — call 3 times ICalculator calc = mock.Object; @@ -136,7 +136,7 @@ public async Task Verify_AtMost_Fails_When_Exceeded() public async Task Verify_Between_Succeeds() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — call twice ICalculator calc = mock.Object; @@ -152,7 +152,7 @@ public async Task Verify_Between_Succeeds() public async Task Verify_Between_Fails_When_Outside_Range() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — call once ICalculator calc = mock.Object; @@ -171,7 +171,7 @@ public async Task Verify_Between_Fails_When_Outside_Range() public async Task Verify_With_Exact_Args_Only_Matching_Calls_Count() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act — call with different args ICalculator calc = mock.Object; @@ -189,7 +189,7 @@ public async Task Verify_With_Exact_Args_Only_Matching_Calls_Count() public async Task Verify_WasCalled_Shorthand_At_Least_Once() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act ICalculator calc = mock.Object; @@ -204,7 +204,7 @@ public async Task Verify_WasCalled_Shorthand_At_Least_Once() public async Task Verify_WasCalled_Shorthand_Fails_When_Not_Called() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Assert — WasCalled() should fail when not called var exception = Assert.Throws(() => @@ -219,7 +219,7 @@ public async Task Verify_WasCalled_Shorthand_Fails_When_Not_Called() public async Task Verify_Void_Method() { // Arrange - var mock = Mock.Of(); + var mock = ICalculator.Mock(); // Act ICalculator calc = mock.Object; @@ -236,7 +236,7 @@ public async Task Verify_Void_Method() public async Task Verify_String_Method_On_Different_Interface() { // Arrange - var mock = Mock.Of(); + var mock = IGreeter.Mock(); mock.Greet("Alice").Returns("Hello, Alice!"); // Act diff --git a/TUnit.Mocks.Tests/VerifyAllTests.cs b/TUnit.Mocks.Tests/VerifyAllTests.cs index aa7aad51ae..61b234ffca 100644 --- a/TUnit.Mocks.Tests/VerifyAllTests.cs +++ b/TUnit.Mocks.Tests/VerifyAllTests.cs @@ -13,7 +13,7 @@ public interface IService [Test] public async Task VerifyAll_Passes_When_All_Setups_Invoked() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); mock.Process(Any()); @@ -28,7 +28,7 @@ public async Task VerifyAll_Passes_When_All_Setups_Invoked() [Test] public async Task VerifyAll_Fails_When_Setup_Not_Invoked() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); mock.Process(Any()); @@ -42,7 +42,7 @@ public async Task VerifyAll_Fails_When_Setup_Not_Invoked() [Test] public async Task VerifyAll_Fails_When_No_Setups_Called() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var ex = Assert.Throws(() => mock.VerifyAll()); @@ -52,7 +52,7 @@ public async Task VerifyAll_Fails_When_No_Setups_Called() [Test] public async Task VerifyAll_Passes_When_No_Setups_Registered() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.VerifyAll(); // No setups = nothing to verify await Assert.That(true).IsTrue(); } @@ -60,7 +60,7 @@ public async Task VerifyAll_Passes_When_No_Setups_Registered() [Test] public async Task VerifyAll_Multiple_Uninvoked_Shows_All() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue("a").Returns("val"); mock.Process(42); diff --git a/TUnit.Mocks.Tests/VerifyNoOtherCallsTests.cs b/TUnit.Mocks.Tests/VerifyNoOtherCallsTests.cs index 1ae1f390d4..03dd840a78 100644 --- a/TUnit.Mocks.Tests/VerifyNoOtherCallsTests.cs +++ b/TUnit.Mocks.Tests/VerifyNoOtherCallsTests.cs @@ -14,7 +14,7 @@ public interface IService [Test] public async Task VerifyNoOtherCalls_Passes_When_All_Calls_Verified() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var svc = mock.Object; @@ -29,7 +29,7 @@ public async Task VerifyNoOtherCalls_Passes_When_All_Calls_Verified() [Test] public async Task VerifyNoOtherCalls_Fails_When_Unverified_Calls_Exist() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var svc = mock.Object; @@ -46,7 +46,7 @@ public async Task VerifyNoOtherCalls_Fails_When_Unverified_Calls_Exist() [Test] public async Task VerifyNoOtherCalls_Passes_When_No_Calls_Made() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.VerifyNoOtherCalls(); await Assert.That(true).IsTrue(); } @@ -54,7 +54,7 @@ public async Task VerifyNoOtherCalls_Passes_When_No_Calls_Made() [Test] public async Task VerifyNoOtherCalls_Works_After_Reset() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var svc = mock.Object; @@ -69,7 +69,7 @@ public async Task VerifyNoOtherCalls_Works_After_Reset() [Test] public async Task VerifyNoOtherCalls_Multiple_Unverified_Shows_All() { - var mock = Mock.Of(); + var mock = IService.Mock(); mock.GetValue(Any()).Returns("value"); var svc = mock.Object; diff --git a/docs/docs/assertions/null-and-default.md b/docs/docs/assertions/null-and-default.md index e126e3aba4..0facb49a16 100644 --- a/docs/docs/assertions/null-and-default.md +++ b/docs/docs/assertions/null-and-default.md @@ -233,7 +233,7 @@ public async Task Uninitialized_Field() [Test] public async Task Constructor_Injection() { - var logger = Mock.Of(); + var logger = ILogger.Mock(); var service = new UserService(logger.Object); // Verify dependency was injected diff --git a/docs/docs/assertions/types.md b/docs/docs/assertions/types.md index 9d1ab00cd8..bffcf9b0ed 100644 --- a/docs/docs/assertions/types.md +++ b/docs/docs/assertions/types.md @@ -631,7 +631,7 @@ public async Task Type_Is_Serializable() [Test] public async Task Mock_Implements_Interface() { - var mock = Mock.Of(); + var mock = IUserRepository.Mock(); var instance = mock.Object; await Assert.That(instance).IsAssignableTo(); diff --git a/docs/docs/writing-tests/mocking/advanced.md b/docs/docs/writing-tests/mocking/advanced.md index 6a6df8ea02..261cb495d4 100644 --- a/docs/docs/writing-tests/mocking/advanced.md +++ b/docs/docs/writing-tests/mocking/advanced.md @@ -17,7 +17,7 @@ public interface IConnection event Action? OnDisconnect; } -var mock = Mock.Of(); +var mock = IConnection.Mock(); // Subscribe to the event string? received = null; @@ -47,7 +47,7 @@ The typed raise methods are generated per-event with correct parameter types, gi Query and react to event subscriptions through the strongly-typed `Events` surface: ```csharp -var mock = Mock.Of(); +var mock = IConnection.Mock(); // Register callbacks for subscribe/unsubscribe mock.Events.OnMessage.OnSubscribe(() => Console.WriteLine("subscribed")); @@ -73,7 +73,7 @@ public interface IConnection void Disconnect(); } -var mock = Mock.Of(); +var mock = IConnection.Mock(); mock.SetState("disconnected"); mock.InState("disconnected", m => @@ -122,7 +122,7 @@ public interface IServiceB int GetValue(); } -var mock = Mock.Of(); +var mock = IServiceA.Mock(); // GetServiceB() automatically returns an auto-mock var serviceB = mock.Object.GetServiceB(); @@ -135,7 +135,7 @@ autoMock.GetValue().Returns(42); var value = serviceB.GetValue(); // 42 ``` -Use `Mock.Get(obj)` to retrieve the `Mock` wrapper for any mock object — auto-mocked return values, or any object created by `Mock.Of`. Auto-mocks are cached — calling the same method returns the same mock instance. +Use `Mock.Get(obj)` to retrieve the `Mock` wrapper for any mock object — auto-mocked return values, or any object created by `T.Mock()`. Auto-mocks are cached — calling the same method returns the same mock instance. ## MockRepository @@ -214,7 +214,7 @@ public class TestDefaults : IDefaultValueProvider }; } -var mock = Mock.Of(); +var mock = IService.Mock(); mock.DefaultValueProvider = new TestDefaults(); var name = mock.Object.GetName(); // "test-default" (no setup needed) diff --git a/docs/docs/writing-tests/mocking/argument-matchers.md b/docs/docs/writing-tests/mocking/argument-matchers.md index 9579195027..bf81df5cb7 100644 --- a/docs/docs/writing-tests/mocking/argument-matchers.md +++ b/docs/docs/writing-tests/mocking/argument-matchers.md @@ -243,7 +243,7 @@ public interface IBufferProcessor int Parse(ReadOnlySpan text); } -var mock = Mock.Of(); +var mock = IBufferProcessor.Mock(); // Setup — ref struct param is visible in the API mock.Process(RefStructArg>.Any).Callback(() => Console.WriteLine("called")); @@ -263,7 +263,7 @@ public interface IMixedProcessor int Compute(int id, ReadOnlySpan data); } -var mock = Mock.Of(); +var mock = IMixedProcessor.Mock(); // Match on 'id', accept any span value mock.Compute(1, RefStructArg>.Any).Returns(100); diff --git a/docs/docs/writing-tests/mocking/index.md b/docs/docs/writing-tests/mocking/index.md index 06d49b3354..b435f528d9 100644 --- a/docs/docs/writing-tests/mocking/index.md +++ b/docs/docs/writing-tests/mocking/index.md @@ -63,10 +63,10 @@ public class GreeterTests } ``` -You can also use the `Mock.Of()` factory — both produce the same result for interfaces: +The `Mock.Of()` factory is also available as an alternative syntax: ```csharp -var mock = Mock.Of(); +var mock = Mock.Of(); // equivalent to IGreeter.Mock() ``` ## Key Concepts @@ -75,8 +75,7 @@ var mock = Mock.Of(); | Factory Method | Use Case | |---|---| -| `Mock.Of()` | Mock an interface, abstract class, or concrete class | -| `IMyInterface.Mock()` | Create a mock that directly implements the interface ([details](#typed-mock-wrapper)) | +| `T.Mock()` | Mock an interface, abstract class, or concrete class — the recommended syntax ([details](#typed-mock-wrapper)) | | `Mock.OfDelegate()` | Mock a delegate (`Func<>`, `Action<>`, etc.) | | `Mock.Wrap(instance)` | Wrap a real object with selective overrides | | `Mock.Of()` | Mock multiple interfaces on a single object | @@ -89,13 +88,13 @@ var mock = Mock.Of(); All factory methods accept an optional `MockBehavior` parameter: ```csharp -var loose = Mock.Of(); // loose (default) -var strict = Mock.Of(MockBehavior.Strict); // throws on unconfigured calls +var loose = IService.Mock(); // loose (default) +var strict = IService.Mock(MockBehavior.Strict); // throws on unconfigured calls ``` ### The Mock Wrapper -`IService.Mock()` and `Mock.Of()` return a `Mock` wrapper (for interfaces, a generated subclass that also implements the interface). Extension methods are generated directly on `Mock` for each member of the mocked type, and the chain methods (`.Returns()`, `.WasCalled()`, etc.) disambiguate between setup and verification: +`T.Mock()` returns a `Mock` wrapper (for interfaces, a generated subclass that also implements the interface). Extension methods are generated directly on `Mock` for each member of the mocked type, and the chain methods (`.Returns()`, `.WasCalled()`, etc.) disambiguate between setup and verification: ```csharp var mock = IService.Mock(); @@ -108,7 +107,7 @@ mock.Object // the T instance (also available v ### Typed Mock Wrapper -The `IMyInterface.Mock()` syntax (a C# 14 static extension member) returns a specialized wrapper type that extends `Mock` **and** implements the interface directly. This means the mock can be used anywhere the interface is expected — no `.Object` or cast needed: +For interfaces, `IMyInterface.Mock()` (a C# 14 static extension member) returns a specialized wrapper type that extends `Mock` **and** implements the interface directly. This means the mock can be used anywhere the interface is expected — no `.Object` or cast needed: ```csharp var mock = IGreeter.Mock(); @@ -123,24 +122,23 @@ mock.Greet(Any()).Returns("Hello!"); mock.Greet("Alice").WasCalled(); ``` -Both `Mock.Of()` and `IMyInterface.Mock()` produce the same wrapper type for interfaces, so you can use them interchangeably. The `IMyInterface.Mock()` form is more concise and makes the intent clearer. - -An optional `MockBehavior` parameter is supported: +`T.Mock()` is the recommended syntax for all types — interfaces, abstract classes, and concrete classes. For interfaces it returns a typed wrapper; for classes it returns `Mock`. Constructor arguments are supported as strongly-typed parameters: ```csharp var strict = IGreeter.Mock(MockBehavior.Strict); +var service = MyService.Mock("connectionString", 42); ``` :::note -`IMyInterface.Mock()` requires C# 14 / .NET 10 or later (it uses C# 14 static extension members). For older language versions, or for multi-interface mocks, interfaces with static abstract members, delegates, partial mocks, and wrap mocks, use the `Mock.Of()` / `Mock.Wrap()` / `Mock.OfDelegate()` factory methods. +`T.Mock()` requires C# 14 / .NET 10 or later (it uses C# 14 static extension members). For older language versions, or for multi-interface mocks, interfaces with static abstract members, delegates, and wrap mocks, use the `Mock.Of()` / `Mock.Wrap()` / `Mock.OfDelegate()` factory methods. ::: ### Implicit Conversion -`Mock` also supports implicit conversion to `T` — so `Mock.Of()` works without `.Object` too: +`Mock` also supports implicit conversion to `T` — so `T.Mock()` works without `.Object`: ```csharp -var mock = Mock.Of(); +var mock = IGreeter.Mock(); IGreeter greeter = mock; // implicit conversion ``` @@ -156,7 +154,7 @@ IGreeter greeter = mock; // implicit conversion TUnit.Mocks imports matchers globally — no `Arg.` prefix needed. Raw values, inline lambdas, and `Any()` work directly as arguments: ```csharp -var mock = Mock.Of(); +var mock = IUserService.Mock(); // Any() — matches everything mock.GetUser(Any()).Returns(user); diff --git a/docs/docs/writing-tests/mocking/setup.md b/docs/docs/writing-tests/mocking/setup.md index 17ecc42bb6..60a7fc5db9 100644 --- a/docs/docs/writing-tests/mocking/setup.md +++ b/docs/docs/writing-tests/mocking/setup.md @@ -115,7 +115,7 @@ mock.Name.Setter.Throws(); Call `SetupAllProperties()` to make properties behave like real auto-properties — setters store values, getters return them: ```csharp -var mock = Mock.Of(); +var mock = IEntity.Mock(); mock.SetupAllProperties(); mock.Object.Name = "Alice"; @@ -167,7 +167,7 @@ public abstract class Calculator public abstract int Multiply(int a, int b); } -var mock = Mock.Of(); +var mock = Calculator.Mock(); mock.Multiply(Any(), Any()).Returns(99); mock.Object.Add(2, 3); // 5 (base implementation) @@ -177,7 +177,7 @@ mock.Object.Multiply(2, 3); // 99 (mocked) Pass constructor arguments for non-default constructors: ```csharp -var mock = Mock.Of("connectionString", 42); +var mock = MyService.Mock("connectionString", 42); ``` ## Interfaces with Static Abstract Members