2010-01-23 9 views
11

Ho cercato informazioni discrete sull'uso di Rhino Mock 3.5+ con la sintassi AAA. Trovo molti blog che hanno un mix di cose del vecchio e del nuovo che sembrano rendere più difficile capire come usarlo.Rhino Mocks AAA Avvio rapido?

Sarebbe bello se ci fosse un Rhino Mocks AAA Cheat Sheet come è stato fatto per una versione precedente. È necessario che tu sappia tutto sulle vecchie versioni di Rhino per utilizzare effettivamente la versione più recente? Sono sicuro che se fossi un esperto mi piacerebbe moltissimo avere tutte le funzionalità di Rhino, ma per ora sto solo nuotando nelle informazioni. Eventuali puntatori o buoni collegamenti sarebbero totalmente apprezzati!

risposta

1

Suppongo che abbiate familiarità con official documentation, il che è abbastanza buono secondo me. Il mio suggerimento è di provare a usare Rhino, e quando si incontra qualche problema più specifico, cerca la soluzione wither su SO o altrove. Non penso che ci sia un cheat completo per i mocciosi di Rhino. Immagino che avrai più fortuna chiedendo "Come posso fare questo e quello usando Rhino Mocks"

Modifica: Bene, non è necessario utilizzare Record/Riproduzione quando si mira AAA. ci sono tre passi necessari per AAA:

  • organizzare, che sta per impostare il comportamento della classe di deriso, ad esempio

.

IOmicronDll mockWrapper = MockRepository.GenerateMock<IOmicronDll>(); 
mockWrapper.Expect(wrapper => wrapper.Lock(1, ref errors)).OutRef(string.Empty).Return(true).Repeat.Any(); 
mockWrapper.Expect(wrapper => wrapper.Exec(1, "sys:cfg?(type)", ref output, ref errors)).OutRef("1,CMC 56,0;", "").Return(true).Repeat.Any(); 
mockWrapper.Expect(wrapper => wrapper.Exec("1", "sys:cfg?(type)", ref output, ref errors)).OutRef("1,CMC 56,0;", "").Return(true).Repeat.Any(); 
Microsoft.Practices.Unity.UnityContainer c = new Microsoft.Practices.Unity.UnityContainer(); 
c.RegisterInstance<IOmicronDll>(mockWrapper); 
  • Act, che si distingue per l'esecuzione dei test

    public Omicron(int deviceID) 
    { 
        try 
        { 
         if (g_Omicron == null) 
          g_Omicron = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<CMEngineWrapper.IOmicronDll>(); 
         m_UniqueIdentifier = Guid.NewGuid(); 
         m_Logger = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<AdvAdmittance.Framework.ILogger>(); 
         m_ID = deviceID; 
         GetConfiguration(); 
         g_InstancesCount++; 
         m_PollThread = new Thread(new ThreadStart(DoPoll)); 
         m_PollThread.Start(); 
        } 
    
  • E Assert, che sta per veryfing i risultati

.

Assert.AreEqual("CMC 56", omicron.Type); 
mockWrapper.AssertWasCalled(wrapper => wrapper.Release(), options => options.Repeat.AtLeastOnce()); 

Forse gli esempi sopra riportati non sono i migliori, ma potrebbero portarti nella giusta direzione.

+0

Grazie e sì - Ayende ha sicuramente delle ottime cose. Proprio come un principiante che vuole imparare come fare AAA con Rhino sembra quasi che debba farlo usando Record/Playback e quindi come domande specifiche su come farlo in stile AAA? Corso, dovrei prima imparare il Record/Playback. Ecco perché sono confuso da dove iniziare a fare anche una bella domanda. –

+2

Il mio suggerimento è di saltare del tutto la registrazione/riproduzione. Penso che la sintassi AAA sia più pulita e più facile da capire e non hai davvero bisogno di sapere come è stato fatto in passato usando R/P. Inizia scrivendo alcuni semplici test unitari e fai asserzioni nel modo in cui pensi che funzioni Rhino. Questo ti aiuterà a fare pratica con la sintassi AAA. –

+2

-1 l'idea di AAA è che si configurano gli stub con comportamento all'inizio e si fanno asserzioni alla fine (come mostrato nella documentazione a cui si collega). Ma stai usando mock invece di stub, hai impostato le aspettative all'inizio, e le aspettative non sono mai nemmeno verificate perché non usi "VerifyAllExpectations" da nessuna parte. È evidente da questa domanda di follow-up da Bill che lo hai confuso: http://stackoverflow.com/questions/2349454/rhinomocks-aaa-syntax/2350864#2350864 –

1

Prima assicurati di sapere cosa intendi per ogni A in AAA. Si può sapere, ma io ti inserire i miei definizioni di lavoro per la completezza della risposta:

  • Disporre è dove ho creato ingressi, deride/stub, l'oggetto con il metodo in prova
  • Act è dove chiamo il metodo in prova
  • Assert è dove verifico verificati cose o non secondo aspettativa

mi piace inserire commenti nel mio codice di test per ricordarmi di pensare a ciascuna di queste cose.Un esempio può aiutare a chiarire: Supponiamo che abbia una classe del livello di servizio che utilizza due classi di livello del provider, una da un sistema "vecchio" e una da un sistema "nuovo"; Sto testando che il metodo che copia le vecchie cose nel nuovo sistema chiama il metodo "CreateThing" una volta per ogni vecchia cosa trovata.

[Test] 
public void Should_create_new_Thing_for_each_old_Thing() 
{ 
    // ----- 
    // arrange 

    // hardcode results from old system provider 
    List<Thing> oldThings = new List<Thing> { ... }; 

    // old system provider 
    var oldProvider = MockRepository.GenerateStub<IOldSystemProvider>(); 
    oldProvider.Stub(m=>m.GetThings()).Return(oldThings); 

    // new system provider 
    var newProvider = MockRepository.GenerateStub<INewSystemProvider>(); 

    // service object 
    var svc = new MyService(oldProvider, newProvider); 

    //----------- 
    // act 
    var result = svc.CopyThings(); 

    //------------ 
    // assert 
    oldThings.ForEach(thing => 
        newProvider.AssertWasCalled(prov => prov.CreateThing(thing))); 
} 
Problemi correlati