以下文档示例(但使用异步方法)

时间:2017-06-27 19:46:22

标签: c# asynchronous nsubstitute

所以我尝试从文档中复制一个关于异常抛出的例子,并将其添加到我的一个方法中:

.Returns( x => { throw new Exception(); });

但是这会导致以下编译器错误:

  

错误CS0121以下方法或之间的调用不明确   属性:' SubstituteExtensions.Returns(T,Func,   params Func [])'和   ' SubstituteExtensions.Returns(Task,Func,params   FUNC [])'

我使用的方法是异步方法。我尝试先等待该方法,但是返回一个不同的错误,说它

  

不能返回类型X的值(预期类型Task`1)

更新: 我可以将返回中的lambda更改为异步,以此来绕过编译器错误,但这会导致警告。所以我想现在的问题更多的是关于是否有办法在没有警告显示的情况下绕过这一点,并且没有在lambda本身内添加不必要的等待代码?

有没有办法避免这种情况?我使用的是NSubstitute 2.0.3

感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

您的问题中的编译器错误看起来像是在调用返回Task而不是Task<T>的内容?这个样本适合我:

public interface ISample {
    Task DoStuff(string name);
}

[Test]
public async Task SampleTest()
{
    var sample = Substitute.For<ISample>();
    sample.DoStuff("test").Returns(x => { throw new Exception("doh"); });
    // ...
}

当我有一个通用的Task<T>时,我倾向于得到这个错误,可以通过在.Returns()调用中指定返回类型来解决这个错误:

public interface IRepository {
    Task<int> FindId(string name);
}

[Test]
public async Task SampleTest2()
{
    var sample = Substitute.For<IRepository>();
    sample.FindId("test").Returns<int>(x => { throw new Exception("doh"); });
    // ...
}

在上面的例子中,我通过使用.Returns<int>(...)删除了歧义,它将选择编译器错误中提到的第一个重载。

如果这没有用,你可以发布被测试方法的签名吗?

答案 1 :(得分:2)

如果您想要Task方法,请添加到Davids接受的答案中,因为您的方法实际上返回了Task,那么您只需指定Returns<Task>

object.Method().Returns<Task>(x => { throw new Exception("You messed up"); });

不必指定完整的返回类型,即不必执行此操作-> Task<IEnumerable<YourClass>>