我有一个类的方法具有这样的签名:
public async Task<ResponseType> getSuff(string id,
string moreInfo,
deletegateName doStuff
) { // details. }
我试图像这样用NSubstitute模拟此调用:
MyClass helper = Substitute.ForPartsOf<MyClass>();
ResponseType response = new ResponseType();
helper.getSuff(Arg.Any<string>(),
Arg.Any<string>(),
Arg.Any<DelegateDefn>()).Returns(Task.FromResult(response));
但是我遇到了运行时错误:
NSubstitute.Exceptions.CouldNotSetReturnDueToNoLastCallException:
找不到回电的电话。
确保在调用替代项(用于
例如:mySub.SomeMethod()。Returns(value)),而您不是
在Return()中配置其他替代项(例如,避免
这:mySub.SomeMethod()。Returns(ConfigOtherSub()))。
如果您用类而不是接口代替,请检查
与您的替代人的通话是通过虚拟/抽象会员进行的。返回
值不能为非虚拟/非抽象成员配置。
正确使用:mySub.SomeMethod()。Returns(returnValue);
潜在的问题使用:
mySub.SomeMethod()。Returns(ConfigOtherSub());而是尝试:var
returnValue = ConfigOtherSub();
mySub.SomeMethod()。Returns(returnValue);
我认为问题是代表。我只想模拟该方法,我不希望实际传递的委托被执行。
那么,有谁知道我如何实现这一目标?
谢谢。
最佳答案
NSub与委托和异步代码完美配合。这是一个简单的例子:
public delegate void SomeDelegate();
public class Foo
{
public virtual async Task<int> MethodWithDelegate(string something, SomeDelegate d)
{
return await Task.FromResult(1);
}
}
[Test]
public void DelegateInArgument()
{
var sub = Substitute.For<Foo>();
sub.MethodWithDelegate("1", Arg.Any<SomeDelegate>()).Returns(1);
Assert.AreEqual(1, sub.MethodWithDelegate("1", () => {}).Result);
Assert.AreNotEqual(1, sub.MethodWithDelegate("2", () => {}).Result);
}
请确保您指定的方法是虚拟的或抽象的。从异常中您得到:
如果您是用类而不是接口代替的,请检查对替代者的调用是否在虚拟/抽象成员上。不能为非虚拟/非抽象成员配置返回值。
关于c# - 如何在NSubstitute中处理委托(delegate)参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40989594/