2016-02-22 44 views
8

Tôi đang cố gắng tập luyện nếu đó là điều tôi đang làm sai, hoặc một vấn đề của nó trong moq hoặc NUnit. Tôi đang gọi một điểm cuối xà phòng và tham chiếu dịch vụ của tôi là tạo ra cả hai phương thức đồng bộ và không đồng bộ. Cuộc gọi tôi đang thực hiện, trông giống như sau:Moq Async Callback Không có nhiều tham số

public async Task DoThisAsync(idnameobject myobj, int id) 
{ 
    await ws.DoSomethingAsync(myobj, id); 
} 

Tôi đang thiết lập moq để trả về cuộc gọi lại, vì vậy tôi có thể lồng ghép các tham số mà tôi đã gọi dịch vụ web. Bài kiểm tra của tôi trông giống như sau:

var callback = new idnameobject();  

wsMock 
.SetUp(w => w.DoSomethingAsync(It.IsAny<idnameobject>(), It.IsAny<int>()) 
.Callback<idnameobject, int>((obj, id) => callback = obj); 

await myservice.DoThisAsync(myobj, id); 

Assert.That(callback.Id, Is.EqualTo(myobj.Id)); 

Tại thời điểm này, tôi nhận được ngoại lệ tham chiếu null khi gọi phương thức của tôi, không chứa bất kỳ thông tin nào trong ngăn xếp ngăn xếp. Tất cả những gì tôi có là Exception thrown: 'System.AggregateException' in mscorlib.dll ở đầu ra.

Bit lạ, là nó không thất bại nếu tôi thiết lập gọi lại từ phương thức đồng bộ và thay đổi phương thức của tôi để gọi đó.

Nó cũng không thành công nếu tôi gọi một phương thức không đồng bộ chỉ có một tham số.

Nếu ai có ý tưởng, xin vui lòng cho tôi biết vì tôi không muốn thay đổi phương pháp của tôi vì các bài kiểm tra của chúng tôi, nhưng lý tưởng tôi muốn thử nghiệm của mình để đảm bảo tôi đang gọi dịch vụ web chính xác.

Trả lời

20

Bạn đang chế nhạo ws.DoSomethingAsync() nhưng không thiết lập để trả lại bất kỳ thứ gì. Phương thức DoThisAsync() sẽ thất bại vì nó sẽ cố gắng chờ đợi. Bạn có thể khắc phục điều này bằng cách thay đổi thiết lập mã của bạn để

wsMock.SetUp(w => w.DoSomethingAsync(It.IsAny<idnameobject>(), It.IsAny<int>()) 
    .Callback<idnameobject, int>((obj, id) => callback = obj) 
    .Returns(Task.FromResult(0)); 

Nếu bạn đang sử dụng .NET 4.6 hoặc cao hơn, bạn có thể thay thế Task.FromResult(0) với Task.CompletedTask.

+0

Giải thích tuyệt vời và khắc phục sự cố của tôi. Ước gì tôi có thể đánh dấu nó như là câu trả lời cho bạn. – mikesigs

+0

Xin lỗi, điều này đã trả lời câu hỏi của tôi, chỉ hơi chậm để đánh dấu câu hỏi đó – Tom

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