Home > Blockchain >  Mocking C# Func Delegate
Mocking C# Func Delegate

Time:03-29

I have a question, I have a dependency that is resolved using the Func delegate, how can I use moq in this scenario?

 public Func<string, IMylogic> MyLogic { get; set; }

The definition is this:

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {           
        builder.Services.AddTransient(Factory);
    }

    private static Func<IServiceProvider, Func<string, IMyLogic>> Factory =>
    service =>
    {
        return key =>
        {
            return new MyLogic(key, new System.Net.Http.HttpClient());
        };
    };
}

This is just an idea on how the test should work:

public class ExecuteEmitLogicTest
{
    ExecuteTransactionCommand ExecuteEmitCommand;
    Dictionary<string, StringValues> queryString;
    Mock<Func<string, IMyLogic>> Concrete;
       
    [Fact]
    public async Task ExecuteEmit()
    { 
        var Concrete = mockFactory.Create<Func<string, IMyLogic>>(MockBehavior.Loose);
        Concrete.Setup(c => c.Invoke(ConcreteTInfo).Execute(request, Guid.Parse(sessionId))).Returns(Task.FromResult(pol));
        ExecuteEmitCommand = new ExecuteTransactionCommand(Concrete.Object);
        var response = await ExecuteEmitCommand.ExecuteAndEmit(queryString, ConcreteTInfo.ApiSkrUrl, ConcreteTInfo.SkrKey, FIXED_HASH);
        Assert.True(response.IsValid);
    }
}

CodePudding user response:

I don't understand the redirection part with the <string, interface> function, but I would imagine the test to look more like this:

public interface IMyLogic { int GetX(); }
...

Mock<IMyLogic> mockLogic = new Mock<IMyLogic>(MockBehavior.Strict);
// For the unit test always return the mock as 
// we are *not* testing the IMyLogic provider function
Func<string, IMyLogic> f = (string _) => mockLogic.Object;

mockLogic.Setup(ml => ml.GetX()).Returns(7);

var tested = new ExecuteTransactionCommand(f);
var response = await tested.ExecuteAndEmit(queryString, ConcreteTInfo.ApiSkrUrl, ConcreteTInfo.SkrKey, FIXED_HASH);
// Asserts here
  • Related