繁体   English   中英

如何在NSubstitute中处理委托参数

[英]How to handle delegate parameter in NSubstitute

我有一个类的方法具有这样的签名:

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))后调用了Returns(),并且确保没有在Returns()中配置其他替代项(例如,避免这种情况:mySub.SomeMethod( )。返回(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);
}

请确保您指定的方法是虚拟的或抽象的。 从异常中您得到:

如果您是用类而不是接口代替的,请检查对替代者的调用是否在虚拟/抽象成员上。 不能为非虚拟/非抽象成员配置返回值。

暂无
暂无

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

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