2012-06-08 17 views
6

Questo è come si suppone per iniettare le dipendenze per il vostro gestore NServiceBus per provarlo:Dependency Injection per NServiceBus unit testing gestore

Test.Handler<YourMessageHandler>() 
    .WithExternalDependencies(h => h.Dependency = yourObj) 

(http://nservicebus.com/UnitTesting.aspx)

Tuttavia ciò significa la mia dipendenza riferimento a un oggetto dovrebbe essere pubblico che non mi piace molto. C'è un modo per mantenerlo privato readonly e assegnarlo all'interno del costruttore, in modo che l'implementazione debba essere passata solo attraverso il gestore handler?

Grazie

risposta

5

È possibile utilizzare l'iniezione costruttore utilizzando la seguente sintassi:

Test.Handler<YourMessageHandler>(bus => new YourMessageHandler(dep1, dep2)) 

Dove dep1 e dep2 sono con ogni probabilità solo alcuni stub o deride che il quadro di scherno cucinato per voi.

- aggiornato da Udi Dahan da qui:

È possibile accedere all'istanza bus deriso via Test.Bus.

+0

Ho provato questo approccio, ma il problema è che la proprietà IBus del mio gestore è nullo nel caso, ho bisogno che sia inizializzata correttamente – YMC

+0

Intendi referenziare IBus nel gestore? Non è possibile aggiungere un parametro costruttore per quello? Dovresti essere in grado di fare semplicemente qualcosa con l'effetto di 'public YourMessageHandler (IDependency dep1, IOtherDependency dep2, bus IBus)' e assegnarlo semplicemente da lì. Mi scuso se mi manca qualcosa di ovvio, non ho mai avuto problemi a ottenere i riferimenti di cui avevo bisogno prima. – tmesser

+0

a destra, all'interno del gestore Bus.Send <> (...) viene utilizzato, quindi è necessario verificarne l'esecuzione. Il problema è che non ho idea di come istanziare la proprietà di tipo IBus, si suppone che sia fatto magicamente da NServiceBus, non vedo nemmeno alcuna implementazione pubblica dell'interfaccia, non esiste una classe 'Bus' o qualcosa del genere. Voglio dire, è qualcosa di nascosto da noi sviluppatori dalla libreria NServiceBus – YMC