2016-02-22 2 views
8

Я пытаюсь работать, если это то, что я делаю неправильно, или его проблема в moq или NUnit. Я вызываю конечную точку мыла, и моя служебная ссылка генерирует как синхронные, так и асинхронные методы. Вызов творю, выглядит примерно так:Ошибка обратного вызова Moq Async с несколькими параметрами

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

Я настраиваю мой MOQ вернуть обратный вызов, так что я могу interegate параметров, которые я назвал веб-сервис с. Мой тест выглядит примерно так:

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)); 

На данный момент, я получаю пустую ссылку исключение при вызове моего метода, который не содержит какой-либо информации в трассировке стека. Все, что у меня есть, - Exception thrown: 'System.AggregateException' in mscorlib.dll.

Бит, который является странным, заключается в том, что он не сработает, если я настрою обратный вызов синхронного метода и измените свой метод на вызов.

Он также не работает, если я вызываю метод async, который имеет только один параметр.

Если у кого-нибудь есть идеи, сообщите мне, потому что я не хочу менять свой метод из-за наших тестов, но в идеале я хочу, чтобы мой тест обеспечил правильное обращение к веб-сервису.

ответ

20

Вы издеваетесь над ws.DoSomethingAsync(), но не настроите его на возвращение. Метод DoThisAsync() будет терпеть неудачу, потому что он попытается дождаться нулевого значения. Вы можете это исправить, изменив настроить код

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

Если вы используете .NET 4.6 или выше, вы можете заменить Task.FromResult(0) с Task.CompletedTask.

+0

Отличное объяснение и исправлены проблемы. Хотел бы я отметить это как ответ для вас. – mikesigs

+0

Извините, это ответило на мой вопрос, немного замедлив отметить его как таковой – Tom