RSCG – MockMe
name | MockMe |
nuget | https://www.nuget.org/packages/MockMe/ |
link | https://github.com/connorivy/MockMe/ |
author | connorivy |
Creating mocks for testing classes
This is how you can use MockMe .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net9.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <IsPackable>false</IsPackable> <IsTestProject>true</IsTestProject> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" /> <PackageReference Include="MockMe" Version="1.1.2" /> <PackageReference Include="MSTest.TestAdapter" Version="2.2.10" /> <PackageReference Include="MSTest.TestFramework" Version="2.2.10" /> <PackageReference Include="coverlet.collector" Version="3.2.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\MockData\MockData.csproj" /> </ItemGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> </Project>
The code that you will use is
using MockMe; namespace TestClock; [TestClass] public class TestClock { [TestMethod] public void TestMyClock() { var mock = Mock.Me(default(MyClock)); mock.Setup.GetUtcNow().Returns(DateTime.Now.AddYears(-1)); mock.Setup.GetNow().Returns(DateTime.Now.AddYears(-1)); MyClock clock = mock; Assert.AreEqual(DateTime.Now.AddYears(-1).Year,clock.GetNow().Year); } }
The code that is generated is
// <auto-generated /> #pragma warning disable using System; namespace MockMe { internal static partial class Mock { public static object Me(global::MockMe.DummyClass unusedInstance) { throw new global::System.NotImplementedException(); } } } #pragma warning restore
// <auto-generated /> #pragma warning disable #nullable enable namespace MockMe { internal static partial class Mock { [global::System.CodeDom.Compiler.GeneratedCode("MockMe","1.1.2.0")] public static global::MockMe.Generated.MockData.MyClockMock Me(global::MockData.MyClock? unusedInstance) { return new(); } } } #pragma warning restore
// <auto-generated /> #pragma warning disable #nullable enable using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Reflection; using HarmonyLib; using MockMe; using MockMe.Mocks; using MockMe.Mocks.ClassMemberMocks; using MockMe.Mocks.ClassMemberMocks.CallTracker; namespace MockMe.Generated.MockData { [global::System.CodeDom.Compiler.GeneratedCode("MockMe","1.1.2.0")] internal class MyClockMock : global::MockMe.Abstractions.SealedTypeMock<global::MockData.MyClock> { public MyClockMock() { this.Setup = new MyClockMockSetup(); this.CallTracker = new MyClockMockSetup.MyClockMockCallTracker(this.Setup); this.Assert = new MyClockMockSetup.MyClockMockCallTracker.MyClockMockAsserter(this.CallTracker); global::MockMe.MockStore<global::MockData.MyClock>.Store.TryAdd(this.MockedObject,this); } public MyClockMockSetup Setup { get; } public MyClockMockSetup.MyClockMockCallTracker.MyClockMockAsserter Assert { get; } private MyClockMockSetup.MyClockMockCallTracker CallTracker { get; } internal sealed class Patch23f715ba229342e08d6fb11494a17f90 { private static bool Prefix(global::MockData.MyClock __instance,ref global::System.DateTime __result) { if (global::MockMe.MockStore<global::MockData.MyClock>.TryGetValue<MyClockMock>(__instance,out var mock)) { __result = mock.CallTracker.GetNow(); return false; } return true; } } internal sealed class Patch147ac8e5593f4d678d1855b2e81726e7 { private static bool Prefix(global::MockData.MyClock __instance,ref global::System.DateTime __result) { if (global::MockMe.MockStore<global::MockData.MyClock>.TryGetValue<MyClockMock>(__instance,out var mock)) { __result = mock.CallTracker.GetUtcNow(); return false; } return true; } } static MyClockMock() { var harmony = new global::HarmonyLib.Harmony("com.mockme.patch"); var originalPatch23f715ba229342e08d6fb11494a17f90 = typeof(global::MockData.MyClock).GetMethod("GetNow",new Type[] { } ); var Patch23f715ba229342e08d6fb11494a17f90 = typeof(Patch23f715ba229342e08d6fb11494a17f90).GetMethod("Prefix",global::System.Reflection.BindingFlags.Static | global::System.Reflection.BindingFlags.NonPublic); harmony.Patch(originalPatch23f715ba229342e08d6fb11494a17f90,prefix: new HarmonyMethod(Patch23f715ba229342e08d6fb11494a17f90)); var originalPatch147ac8e5593f4d678d1855b2e81726e7 = typeof(global::MockData.MyClock).GetMethod("GetUtcNow",new Type[] { } ); var Patch147ac8e5593f4d678d1855b2e81726e7 = typeof(Patch147ac8e5593f4d678d1855b2e81726e7).GetMethod("Prefix",global::System.Reflection.BindingFlags.Static | global::System.Reflection.BindingFlags.NonPublic); harmony.Patch(originalPatch147ac8e5593f4d678d1855b2e81726e7,prefix: new HarmonyMethod(Patch147ac8e5593f4d678d1855b2e81726e7)); } } [global::System.CodeDom.Compiler.GeneratedCode("MockMe","1.1.2.0")] internal class MyClockMockSetup : global::MockMe.Mocks.ClassMemberMocks.Setup.MemberMockSetup { private global::MockMe.Mocks.ClassMemberMocks.MemberMock<global::System.DateTime>? GetNow_BagStore; public global::MockMe.Mocks.ClassMemberMocks.MemberMock<global::System.DateTime> GetNow() { return this.GetNow_BagStore ??= new();; } private global::MockMe.Mocks.ClassMemberMocks.MemberMock<global::System.DateTime>? GetUtcNow_BagStore; public global::MockMe.Mocks.ClassMemberMocks.MemberMock<global::System.DateTime> GetUtcNow() { return this.GetUtcNow_BagStore ??= new();; } [global::System.CodeDom.Compiler.GeneratedCode("MockMe","1.1.2.0")] internal class MyClockMockCallTracker : MockCallTracker { private readonly MyClockMockSetup setup; public MyClockMockCallTracker(MyClockMockSetup setup) { this.setup = setup; } private int GetNow_CallStore; public global::System.DateTime GetNow() { this.GetNow_CallStore++; return MockCallTracker.CallMemberMock<global::System.DateTime>(this.setup.GetNow_BagStore); } private int GetUtcNow_CallStore; public global::System.DateTime GetUtcNow() { this.GetUtcNow_CallStore++; return MockCallTracker.CallMemberMock<global::System.DateTime>(this.setup.GetUtcNow_BagStore); } [global::System.CodeDom.Compiler.GeneratedCode("MockMe","1.1.2.0")] internal class MyClockMockAsserter : MockAsserter { private readonly MyClockMockSetup.MyClockMockCallTracker tracker; public MyClockMockAsserter(MyClockMockSetup.MyClockMockCallTracker tracker) { this.tracker = tracker; } public global::MockMe.Asserters.MemberAsserter GetNow() => new(this.tracker.GetNow_CallStore); public global::MockMe.Asserters.MemberAsserter GetUtcNow() => new(this.tracker.GetUtcNow_CallStore); } } } } #pragma warning restore
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/MockMe
Leave a Reply