2016-06-21 3 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 ? 
} 

Update

Пытались предложения, но он не компилируется со следующим сообщением об ошибке

await operator can only be used with an async method. 
+0

IMyService.MyMethodToTest означает, что MyMethodToTest является реализация для метода MyMethodToTest интерфейсной IMyService –

ответ

2

Попробуйте

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

Есть много reasons для implementing 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(""); 
} 

Лично я предпочитаю первый подход.

Обратите внимание на изменение типа возврата с void по номеру Task и делая способ async. Это не имеет ничего общего с явной реализацией интерфейса и просто описывает асинхронные тесты.

+0

спасибо за вашу помощь, хотя она по-прежнему не работает, я обновил свой вопрос с сообщением об ошибке – Jamie

+0

@Jamie: Ну да , это совсем другая проблема. Вам нужно сделать свой тестовый метод асинхронным. Будет обновлен мой ответ, но в основном вы должны исследовать одну проблему за раз. –

Смежные вопросы