2017-01-13 10 views
6

Когда я использую ReturnsAsync(null) в методе C# модульного тестирования в Visual Studio (с Moq), я получаю ошибку:Returnsasync (нуль) создает ошибку сборки при использовании Moq для модульного тестирования в VS15

"The call is ambiguous between the following methods or properties"

и затем список методов ReturnsAsync, которые имеют разные параметры. Я понимаю, что это связано с перегрузкой функции ReturnsAsync. Однако, когда я запускаю один и тот же модульный тест на компьютере моего коллеги, он работает без каких-либо ошибок. Кто-нибудь знает, почему это произойдет? Кто-нибудь знает, как это исправить?

Кроме того, когда я строю, я получаю предупреждения, что:

all packages referencing ******** must install nuget package Microsoft.Bcl.Build.

Может ли это иметь какой-либо эффект?

+0

Вполне нормально использовать 'ReturnAsync (null)'. Проверьте методы с неоднозначным вызовом - где эти методы определены. –

+0

@SergeyBerezovskiy говорит, что метод ReturnsAsync имеет неоднозначный вызов, когда значение null является параметром. –

+0

Да, вы уже заявили, что в вопросе –

ответ

8

Есть два ReturnsAsync методы расширения в Moq ReturnsExtensions class.They имеют следующие параметры:

(this IReturns<TMock, Task<TResult>> mock, TResult value) 
(this IReturns<TMock, Task<TResult>> mock, Func<TResult> valueFunction) 

Как вы можете видеть один принимает значение, которое должно быть возвращено на задание, а другой принимает делегат, который будет возвращать значение. Когда вы проходите null, компилятор не знает, ценит ли он или делегирует. Это не тот случай, когда параметр задачи является типом значения (например, int). Поскольку он не может быть нулем, а компилятор понимает, что null является делегатом. Наверное, так обстоит дело с компьютером вашего коллеги.

Чтобы исправить эту ошибку, вам нужно, чтобы помочь компилятор выбрать правильную перегрузку метода - бросить нуль типу результатов задачи (например строка):

RetursAsync((string)null) 

Или вы можете передать значение, которое является нулевым

string s = null; 
... ReturnsAsync(s); 
+1

в качестве альтернативы вы можете передать ' RetursAsync (по умолчанию (строка)) ' –

+1

Или, если у вас есть много этих ошибок после обновления и не хотят заморачиваться литье в различные типы возвращаемых значений: 'ReturnsAsync (() => null)' –