RSCG – Rocks
| name | Rocks |
| nuget | https://www.nuget.org/packages/Rocks/ |
| link | https://github.com/JasonBock/Rocks/blob/main/docs/Quickstart.md |
| author | Json Bock |
Creating mocks for testing interfaces/classes
This is how you can use Rocks .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.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="MSTest.TestAdapter" Version="2.2.10" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="Rocks" Version="7.1.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MockRock\MockRock.csproj" />
</ItemGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>
The code that you will use is
namespace TestClock;
[TestClass]
public class TestClock
{
[TestMethod]
public void TestMyClock()
{
var expectations = Rock.Create<IMyClock>();
expectations.Methods().GetNow().Returns(DateTime.Now.AddYears(-1));
var mock = expectations.Instance();
var data= mock.GetNow();
Assert.AreEqual(DateTime.Now.Year -1,data.Year);
expectations.Verify();
}
}
The code that is generated is
using Rocks.Extensions;
using System.Collections.Generic;
using System.Collections.Immutable;
#nullable enable
namespace MockRock
{
internal static class CreateExpectationsOfIMyClockExtensions
{
internal static global::Rocks.Expectations.MethodExpectations<global::MockRock.IMyClock> Methods(this global::Rocks.Expectations.Expectations<global::MockRock.IMyClock> @self) =>
new(@self);
internal static global::MockRock.IMyClock Instance(this global::Rocks.Expectations.Expectations<global::MockRock.IMyClock> @self)
{
if (!@self.WasInstanceInvoked)
{
@self.WasInstanceInvoked = true;
var @mock = new RockIMyClock(@self);
@self.MockType = @mock.GetType();
return @mock;
}
else
{
throw new global::Rocks.Exceptions.NewMockInstanceException("Can only create a new mock once.");
}
}
private sealed class RockIMyClock
: global::MockRock.IMyClock
{
private readonly global::System.Collections.Generic.Dictionary<int,global::System.Collections.Generic.List<global::Rocks.HandlerInformation>> handlers;
public RockIMyClock(global::Rocks.Expectations.Expectations<global::MockRock.IMyClock> @expectations)
{
this.handlers = @expectations.Handlers;
}
[global::Rocks.MemberIdentifier(0,"global::System.DateTime GetNow()")]
public global::System.DateTime GetNow()
{
if (this.handlers.TryGetValue(0,out var @methodHandlers))
{
var @methodHandler = @methodHandlers[0];
@methodHandler.IncrementCallCount();
var @result = @methodHandler.Method is not null ?
((global::System.Func<global::System.DateTime>)@methodHandler.Method)() :
((global::Rocks.HandlerInformation<global::System.DateTime>)@methodHandler).ReturnValue;
return @result!;
}
throw new global::Rocks.Exceptions.ExpectationException("No handlers were found for global::System.DateTime GetNow()");
}
[global::Rocks.MemberIdentifier(1,"global::System.DateTime GetUtcNow()")]
public global::System.DateTime GetUtcNow()
{
if (this.handlers.TryGetValue(1,out var @methodHandlers))
{
var @methodHandler = @methodHandlers[0];
@methodHandler.IncrementCallCount();
var @result = @methodHandler.Method is not null ?
((global::System.Func<global::System.DateTime>)@methodHandler.Method)() :
((global::Rocks.HandlerInformation<global::System.DateTime>)@methodHandler).ReturnValue;
return @result!;
}
throw new global::Rocks.Exceptions.ExpectationException("No handlers were found for global::System.DateTime GetUtcNow()");
}
}
}
internal static class MethodExpectationsOfIMyClockExtensions
{
internal static global::Rocks.MethodAdornments<global::MockRock.IMyClock,global::System.Func<global::System.DateTime>,global::System.DateTime> GetNow(this global::Rocks.Expectations.MethodExpectations<global::MockRock.IMyClock> @self) =>
new global::Rocks.MethodAdornments<global::MockRock.IMyClock,global::System.Func<global::System.DateTime>,global::System.DateTime>(@self.Add<global::System.DateTime>(0,new global::System.Collections.Generic.List<global::Rocks.Argument>()));
internal static global::Rocks.MethodAdornments<global::MockRock.IMyClock,global::System.Func<global::System.DateTime>,global::System.DateTime> GetUtcNow(this global::Rocks.Expectations.MethodExpectations<global::MockRock.IMyClock> @self) =>
new global::Rocks.MethodAdornments<global::MockRock.IMyClock,global::System.Func<global::System.DateTime>,global::System.DateTime>(@self.Add<global::System.DateTime>(1,new global::System.Collections.Generic.List<global::Rocks.Argument>()));
}
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/Rocks
Leave a Reply