2016-06-21 125 views
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. 
+0

IMyService.MyMethodToTest意味着MyMethodToTest是接口IMyService –

回答

2

试试这个

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

有许多reasonsimplementing an interface explicitly

或者

[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(); 
} 
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(""); 
} 

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

请注意退货类型从voidTask的变化,并制定方法async。这与显式接口实现无关,只是编写异步测试。

+0

的方法MyMethodToTest实现感谢你的帮助,但它仍然无法正常工作,我已经更新了我的错误消息 – Jamie

+0

@Jamie问题:嗯,是,但这是一个完全不同的问题。你需要使你的测试方法异步。将更新我的答案,但基本上你应该一次研究一个问题。 –

相关问题