[英]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.