2016-06-21 126 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問題:嗯,是,但這是一個完全不同的問題。你需要使你的測試方法異步。將更新我的答案,但基本上你應該一次研究一個問題。 –

相關問題