2017-01-13 14 views
6

Khi tôi sử dụng ReturnsAsync(null) trong một phương pháp C# đơn vị thử nghiệm trong Visual Studio (với Moq), tôi nhận được lỗi:Returnsasync (null) tạo ra một lỗi xây dựng khi sử dụng Moq cho kiểm tra đơn vị trong VS15

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

và sau đó là danh sách các phương thức ReturnsAsync có các thông số khác nhau. Tôi hiểu rằng điều này là do chức năng ReturnsAsync bị quá tải. Tuy nhiên, khi tôi chạy cùng một bài kiểm tra đơn vị trên máy tính của đồng nghiệp của tôi, nó chạy mà không có bất kỳ lỗi nào. Có ai biết tại sao điều này sẽ xảy ra? Có ai biết làm thế nào để sửa lỗi này?

Ngoài ra, khi tôi xây dựng, tôi nhận được lời cảnh báo rằng:

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

rằng có thể có ảnh hưởng gì?

+0

Hoàn toàn OK để sử dụng 'ReturnAsync (null)'. Kiểm tra các phương thức với cuộc gọi không rõ ràng - nơi các phương thức này được xác định. –

+0

@SergeyBerezovskiy nó nói phương pháp ReturnsAsync có một cuộc gọi mơ hồ khi null là một tham số. –

+0

Có, bạn đã tuyên bố rằng trong câu hỏi –

Trả lời

8

Có hai ReturnsAsync phương pháp khuyến nông trong Moq ReturnsExtensions class.They có thông số sau:

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

Như bạn có thể thấy một người chấp nhận giá trị cần được trả về bởi nhiệm vụ, và một người khác chấp nhận ủy thác mà sẽ trả về giá trị. Khi bạn đang vượt qua null trình biên dịch không biết liệu nó có giá trị hay ủy quyền hay không. Nó không phải là trường hợp khi tham số nhiệm vụ là một loại giá trị (ví dụ: int). Bởi vì nó không thể null và trình biên dịch hiểu rằng null là một delegate. Có lẽ đó là trường hợp với máy tính của đồng nghiệp của bạn.

Để khắc phục lỗi này, bạn cần để giúp trình biên dịch chọn phương pháp đúng quá tải - đúc null để loại kết quả công việc (ví dụ như string):

RetursAsync((string)null) 

Hoặc bạn có thể vượt qua giá trị mà là null

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

cách khác bạn có thể vượt qua ' RetursAsync (mặc định (string)) ' –

+1

Hoặc, nếu bạn có rất nhiều các lỗi sau khi nâng cấp và không muốn làm phiền đúc để các kiểu trả về khác nhau: 'ReturnsAsync (() => null)' –

Các vấn đề liên quan