nsubstitute在以下文档示例(但使用异步方法)时进行模棱两可的呼叫



因此,我尝试复制一个关于从文档中抛出的例外的示例,并将其添加到我的一种方法中:

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

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

错误CS0121呼叫在以下方法之间是模棱两可的,或 属性:'seledututeextensions.turns(t,func, 参数func []('和 'seltituteextensions.turns(任务,func,params func []('

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

无法返回(预期类型task`1(的X型值

更新:我可以将lambda更改为异步,以作为解决编译器错误的一种方式,但这会导致警告。因此,我猜现在的问题更多是关于是否有一种方法可以绕过它而不会出现警告,而又没有在lambda内添加不必要的等待代码?

有没有办法避免这种情况?我正在使用Nsubstitute 2.0.3

感谢您的任何帮助。

您问题中的编译器错误看起来像是在调用返回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>(...)删除了歧义,这将选择编译器错误中提到的第一个过载。

如果没有帮助,您可以发布正在测试的方法的签名吗?

如果您想要任务方法,则添加到Davids接受的答案,因为您的方法实际上确实返回了任务,然后您只需要指定Returns<Task>

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

不必指定完整的返回类型,即不要这样做 -> Task<IEnumerable<YourClass>>

最新更新