2016-02-22 117 views
8

Sto provando ad allenarmi se si tratta di qualcosa che sto facendo male, o è un problema in moq o NUnit. Sto chiamando un soap endpoint e il mio riferimento al servizio sta generando sia i metodi sync che async. La chiamata che sto facendo, sembra qualcosa di simile:Callback asincrono Moq non funziona con più parametri

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

Sto installando il mio moq di restituire il callback, quindi posso interegate i parametri che ho chiamato il servizio web con. La mia prova sembra qualcosa di simile:

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

A questo punto, ottengo un'eccezione riferimento null quando si chiama il mio metodo, che non contiene alcuna informazione nella traccia dello stack. Tutto quello che ho è Exception thrown: 'System.AggregateException' in mscorlib.dll nell'output.

Il bit che è strano, è che non fallisce se imposto il callback dal metodo sincrono e cambio il mio metodo per chiamarlo.

Non guasta anche se chiamo un metodo asincrono che ha solo un parametro.

Se qualcuno ha qualche idea, per favore fatemi sapere come non voglio cambiare il mio metodo a causa dei nostri test, ma idealmente voglio che il mio test garantisca che sto chiamando correttamente il servizio web.

risposta

20

Ti stai prendendo in giro ws.DoSomethingAsync() ma non lo stai configurando per restituire nulla. Il metodo DoThisAsync() avrà esito negativo perché proverà ad attendere null. È possibile risolvere questo problema modificando il codice di impostare fino a

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

Se si utilizza .NET 4.6 o superiore è possibile sostituire con Task.FromResult(0)Task.CompletedTask.

+0

Grande spiegazione e risolto il mio problema. Vorrei poterlo contrassegnare come la risposta per te. – mikesigs

+0

Mi dispiace, questo ha risposto alla mia domanda, solo un po 'lento per contrassegnarlo come tale – Tom