2013-06-25 22 views
5

Sto cercando di ottenere l'accesso a una classe derisa (tramite Nsubstitute) che è stata iniettata sul costruttore.Autofixture + NSubstitute: Freezing a mock?

ero utilizzando il seguente codice

var fixture = new Fixture() 
    .Customize(new AutoNSubstituteCustomization()); 

var sut = fixture.Create<MyService>(); 

SUT viene creato con successo, e una versione deriso di un'interfaccia denominata "IFileUtils" viene iniettato sul costruttore di "MyService".

ma ho bisogno di accesso ad esso, quindi dopo aver letto credo che ho bisogno di congelare l'oggetto in modo ho accesso ad essa in questo modo

var fileUtilMock= fixture.Freeze<Mock<IFileUtils>>(); 

Ma questo codice credo sia una sintassi Moq come "Mock" non può essere trovato

Normalmente per creare un Nsubstitute di una classe di effettuare le seguenti

var fileUtilMock= Substitute.For<IFileUtils>(); 

ma naturalmente questo non è congelato quindi non è utilizzato e iniettato nel costruttore.

qualcuno può aiutare?

risposta

10

basato su inferenze da this Mocking tools comparison article by Richard Banks, e come funziona AutoMoq, ritengo:

  • NSubstitute non ha una separazione tra il Mock e Mock.Object simili Moq fa
  • Un AutoFixture.Auto * gancio estensioni in un SpecimenBuilderNode per fornire l'implementazione [mocked] di interfacce, vale a direfixture.Create<IFileUtils>() dovrebbe funzionare
  • Freeze è equivalente a un var result = fixture.Create<IFileUtils>(); fixture.Inject(result)

Pertanto si dovrebbe solo essere in grado di dire:

var fileUtilMock = fixture.Freeze<IFileUtils>(); 
+0

@daniel hilgarth sono alcune delle mie deduzioni più che buone: D Sentiti libero di modificare quanto vuoi e/o dimmi di cancellare il post! –

6

È necessario Freeze l'istanza auto-beffarda prima di creare l'istanza MyService.

Aggiornamento:

Come Ruben Bartelink sottolinea, con NSubstitute tutto quello che dovete fare è:

var fixture = new Fixture() 
    .Customize(new AutoNSubstituteCustomization()); 

var substitute = fixture.Freeze<IFileUtils>(); 

..e quindi utilizzare metodi di estensione del NSubstitute.

In questo modo la stessa istanza, congelata, verrà fornita al costruttore MyService.

Esempio:

Per un'interfaccia IInterface:

public interface IInterface 
{ 
    object MakeIt(object obj); 
} 

Tutto quello che devi fare con è:

var substitute = fixture.Freeze<IInterface>(); 
substitute.MakeIt(dummy).Returns(null); 

Returns è in realtà un metodo di estensione in NSubstitute.

+0

Ma questo credo sia per Moq, sto usando NSubstitute, e la Falsa - Mock non trovato o esistente .. – Martin

+0

Sei corretto. Ho appena aggiornato la risposta. –