RSCG – MockMe

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


Posted

in

, ,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *