如何处理NSubstitute中的委托参数

时间:2016-12-06 07:01:44

标签: c# 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:   无法找到回复的电话。

     

确保在调用替换后调用Returns()(for   例如:mySub.SomeMethod()。返回(值)),而你不是   在Returns()中配置其他替换(例如,避免   this:mySub.SomeMethod()。返回(ConfigOtherSub()))。

     

如果您替换了类而不是接口,请检查它   对你的替补的召唤是在虚拟/抽象成员身上。返回   无法为非虚拟/非抽象成员配置值。

     

正确使用:mySub.SomeMethod()。返回(returnValue);

     

潜在的问题用途:     。mySub.SomeMethod()返回(ConfigOtherSub());而是尝试:var   returnValue = ConfigOtherSub();     。mySub.SomeMethod()返回(的returnValue);

问题是,我认为是代表。我只想模拟出方法,我不希望实际传递的委托被执行。

那么,有谁知道我怎么能做到这一点? 感谢。

1 个答案:

答案 0 :(得分:3)

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);
}

请确保您指定的方法是虚拟或抽象的。从您获得的例外情况来看:

  

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