2017-01-13 48 views
6

Gdy używam ReturnsAsync(null) w metodzie testowej jednostka C# w Visual Studio (z Moq), pojawia się błąd:Returnsasync (null) tworzy błąd kompilacji przy użyciu MOQ dla testów jednostkowych w VS15

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

i następnie listę metod, które mają różne parametry. Rozumiem, że jest to spowodowane przeciążeniem funkcji ReturnsAsync. Jednak po uruchomieniu tego samego testu jednostki na komputerze mojego kolegi działa on bez żadnych błędów. Czy ktoś wie, dlaczego tak się stało? Czy ktoś wie, jak to naprawić?

Również, gdy buduję, dostaję ostrzeżenia, że:

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

Czy to może mieć jakikolwiek wpływ?

+0

Całkowicie OK jest użycie 'ReturnAsync (null)'. Sprawdź metody z niejednoznacznym wywołaniem - gdzie zdefiniowano te metody. –

+0

@SergeyBerezovskiy mówi, że metoda ReturnsAsync ma niejednoznaczne wywołanie, gdy null jest parametrem. –

+0

Tak, już wspomniano, że w pytaniu –

Odpowiedz

8

Istnieją dwa ReturnsAsync rozszerzenie metod w Min ReturnsExtensions class.They mają następujące parametry:

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

Jak widać ktoś przyjmuje wartości, które powinny być zwracane przez zadania, a drugi przyjmuje delegować która zwróci wartość. Gdy przechodzisz obok kompilatora, nie wiesz, czy go wartościuje, czy przekazuje. Nie jest tak w przypadku, gdy parametr task jest typem wartości (np. Int). Ponieważ nie może mieć wartości null i kompilator rozumie, że wartość null jest delegatem. Prawdopodobnie tak jest z komputerem twojego kolegi.

Aby naprawić ten błąd, czego potrzeba, aby pomóc kompilator wybrać prawidłową przeciążenie metody - cast null typu wyniku zadania należy (na przykład String):

RetursAsync((string)null) 

Albo można przekazać wartość, która jest null

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

alternatywnie można przekazać ' RetursAsync (domyślnie (string)) ' –

+1

Albo, jeśli masz dużo tych błędów po uaktualnieniu i nie chce niepokoić do odlewania różne typy zwracane: 'ReturnsAsync (() => null)' –