繁体   English   中英

设置一个模拟类方法来执行一个 Func<Task> 使用最小起订量的参数

[英]Setup a mocked class method to execute a Func<Task> parameter using Moq

我正在编写涉及服务方法的单元测试,该方法接受Func<Task>参数并在某些条件下执行它。

该方法如下所示:

public class ServiceA : IServiceA
{
   public async Task TryExecute(Func<Task> func, string foo)
   {
      // ... do unimportant things relating to string foo

      await func();
   }
}

调用 TryExecute 方法的服务如下所示

public class ServiceB : IServiceB
{
   private readonly IServiceA _serviceA;

   public ServiceB(IServiceA serviceA)
   {
      _serviceA = serviceA;
   }

   public async MethodThatCallsTryExecute(Bar bar)
   {
      // ... do unimportant things relating to bar

      await _serviceA.TryExecute(privateFunction, "baz");
   }
}

一个失败的单元测试示例,包括在调用TryExecute时尝试设置TryExecute结果,如下所示:

[Fact]
public async void TestName()
{
   // Arrange
   var serviceA = new Mock<IServiceA>();

   serviceA.Setup(a => a.TryExecute(It.IsAny<Func<Task>>(), It.IsAny<string>()))
      .Returns(async (Func<Task> func, string foo) => { await func(); });

   var serviceB = new ServiceB(serviceA.Object);

   var bar = new Bar();

   // Act
   await serviceB.MethodThatCallsTryExecute(bar);

   // Assert
   ... failing assertions

}

问题:测试执行过程中, privateFunction送入TryExecute没有被执行(即在调试时,我无法在步骤privateFunction传入方法)。

如果还有什么我可以详细说明的,请告诉我; 这是我关于 StackOverflow 的第一个问题。

尝试更改MethodThatCallsTryExecute(Bar bar)的签名以返回Task而不是void (如果是),其余代码应按预期工作,只需检查是否调用了privateFunction

public interface IServiceB
{
    Task MethodThatCallsTryExecute(Bar bar);
}

public class ServiceB : IServiceB
{
    private readonly IServiceA _serviceA;

    public ServiceB(IServiceA serviceA)
    {
        _serviceA = serviceA;
    }

    public async Task MethodThatCallsTryExecute(Bar bar)
    {
        // ... do unimportant things relating to bar

        Func<Task> privateFunction = () => Task.CompletedTask;
        await _serviceA.TryExecute(privateFunction , "baz");
    }
}

例如,应更新测试方法(或调用MethodThatCallsTryExecute任何其他方法)的签名以返回Task ,例如

[Fact]
public async Task TestName()
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM