[英]How can I mock an async protected method that has a parameter?
这是我要测试的课程:
namespace ClassLibrary1
{
public class MyBase
{
public async Task DoSomething (MyContext context) => await DoSomethingInternal (context);
public async Task DoSomething() => await DoSomethingInternal();
protected virtual async Task DoSomethingInternal(MyContext context) { }
protected virtual async Task DoSomethingInternal() { }
}
public class MyContext { }
public class MyClass : MyBase
{
protected override Task DoSomethingInternal(MyContext context) => Task.CompletedTask;
protected override Task DoSomethingInternal() => Task.CompletedTask;
}
}
这是测试代码:
namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
[TestMethod]
[ExpectedException(typeof(TaskCanceledException))]
public async Task TestMethod1()
{
var mock = new Mock<MyClass>
{
CallBase = true
};
mock.Protected().Setup<Task>("DoSomethingInternal", new MyContext()).ThrowsAsync(new TaskCanceledException());
var obj = mock.Object;
await obj.DoSomething(null);
}
[TestMethod]
[ExpectedException(typeof(TaskCanceledException))]
public async Task TestMethod2()
{
var mock = new Mock<MyClass>
{
CallBase = true
};
mock.Protected().Setup<Task>("DoSomethingInternal").ThrowsAsync(new TaskCanceledException());
var obj = mock.Object;
await obj.DoSomething();
}
}
}
结果表明,第一个测试失败,第二个成功。 调试显示,对DoSomethingInternal(context)
的第一个测试调用返回Task.CompletedTask
,而不是引发异常。
那我怎么扔呢?
设置中传递的参数与执行测试时传递的实例不匹配。 在这种情况下,您将需要使用参数匹配器以使代码按预期方式流动。
为受保护成员设置期望值,如果需要参数匹配,则必须使用
ItExpr
而不是It
var mock = new Mock<MyClass>() {
CallBase = true
};
mock.Protected()
.Setup<Task>("DoSomethingInternal", ItExpr.IsAny<MyContext>())
.ThrowsAsync(new TaskCanceledException());
var obj = mock.Object;
await obj.DoSomething(null);
参考起订量快速入门:其他
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.