0

我在服务中有以下方法,但我没有在我的单元测试中调用它。该方法使用async/ await代码,而且(我认为这是导致我问题的原因)具有带有点符号的方法名称,老实说,我不确定它的作用是什么?请参阅下面的示例

执行

async Task<IEnumerable<ISomething>> IMyService.MyMethodToTest(string bla)
{
    ...
}

单元测试

[Fact]
public void Test_My_Method()
{
   var service = new MyService(...);
   var result = await service.MyMethodToTest("");  // This is not available ?
}

更新

已尝试建议,但无法编译并显示以下错误消息

await operator can only be used with an async method.
4

2 回答 2

4

是的,显式接口实现只能在接口类型的表达式上调用,而不是实现类型。

只需先将服务转换为接口类型,或使用不同的变量:

[Fact]
public async Task Test_My_Method()
{
    IMyService serviceInterface = service;
    var result = await serviceInterface.MyMethodToTest("");
}

或者

[Fact]
public async Task Test_My_Method()
{
    var result = await ((IMyService) service).MyMethodToTest("");
}

我个人更喜欢前一种方法。

注意返回类型从voidto的变化Task,以及方法的制作async。这与显式接口实现无关,只是编写异步测试。

于 2016-06-21T15:50:44.103 回答
2

尝试这个

var result = await ((IMyService)service).MyMethodToTest("");  

显式实现接口的原因有很多

或者

[Fact]
public async void Test_My_Method()
{
   IMyService service = new MyService(...);
   var result = await service.MyMethodToTest("");  
}

您应该至少使用 xUnit.net 1.9 才能使用async. 如果您使用的是较低版本,那么您应该使用这个:

[Fact]
public void Test_My_Method()
{
    IMyService service = new MyService(...);
    var result = await service.MyMethodToTest("");
    Task task = service.MyMethodToTest("")
           .ContinueWith(innerTask =>
           {
               var result = innerTask.Result;
               // ... assertions here ...
           });

    task.Wait();
}
于 2016-06-21T15:50:43.360 回答