2010-01-23 14 views
11

He estado buscando información decente sobre el uso de Rhino Mocks 3.5+ con la sintaxis AAA. Encuentro muchos blogs que tienen una mezcla de elementos antiguos y nuevos que parecen dificultar la idea de cómo usarlos.Rhino Mocks AAA ¿Arranque rápido?

Sería grandioso si hubiera una hoja de trucos AAA de Rhino Mocks como se hizo para una versión anterior. ¿Es necesario que sepa todo sobre las versiones anteriores de Rhino para usar realmente la versión más nueva? Estoy seguro de que si fuera un experto, me encantaría todas las capacidades de Rhino, pero por ahora estoy nadando en información. ¡Cualquier apuntador o enlace bueno sería totalmente apreciado!

Respuesta

1

Supongo que está familiarizado con official documentation, que es bastante bueno en mi opinión. Mi sugerencia es tratar de usar Rhino, y cuando encuentre un problema más específico, busque la solución que se marchita en SO o en otro lugar. No creo que haya una hoja de trucos completa para los simulacros de Rhino. Supongo que tendrás más suerte al preguntar "¿Cómo puedo hacer esto y aquello usando Rhino Mocks?"

Editar: Bueno, no necesitas usar Grabar/Reproducir cuando apuntas a AAA. Hay tres pasos involucrados en la AAA:

  • organizar, lo que significa la creación de el comportamiento de la clase burlado, por ejemplo

.

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); 
  • Ley, que significa la ejecución de las pruebas

    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(); 
        } 
    
  • Y Assert, lo que significa veryfing los resultados

.

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

Tal vez los ejemplos anteriores no son los mejores, pero pueden llevarlo en la dirección correcta.

+0

Gracias y sí - Ayende tiene algunas cosas buenas por cierto. Así como un novato que quiere aprender a hacer AAA con Rhino, casi parece que tengo que hacerlo usando Grabar/Reproducir y luego, como preguntas específicas, ¿cómo hacerlo al estilo AAA? Por supuesto, primero tendría que aprender la Grabación/Reproducción. Es por eso que estoy confundido por dónde empezar incluso a hacer una buena pregunta. –

+2

Mi sugerencia es omitir Grabar/Reproducir por completo. Creo que la sintaxis de AAA es más clara y fácil de entender y realmente no necesita saber cómo se hizo en el pasado usando R/P. Comience por escribir algunas pruebas de unidades simples y haga afirmaciones de la forma en que cree que funciona Rhino. Esto te ayudará a practicar con la sintaxis AAA. –

+2

-1 La idea de AAA es que establezca stubs con comportamiento al inicio y que haga afirmaciones al final (como se muestra en la documentación que enlaza). Pero está utilizando simulaciones en lugar de resguardos, establece las expectativas desde el principio y las expectativas nunca se verifican porque no usa 'VerifyAllExpectations' en ninguna parte. Es evidente por esta pregunta de seguimiento de Bill que lo confundiste: http://stackoverflow.com/questions/2349454/rhinomocks-aaa-syntax/2350864#2350864 –

1

Primero asegúrese de saber qué quiere decir con cada A en AAA. Usted puede saber pero me va a incluir mis definiciones de trabajo para la integridad de la respuesta:

  • Organizar es donde configurar las entradas, se burla/trozos, el objeto con el método que se está probando
  • Ley es donde yo llamo el método bajo prueba
  • Assert es donde verifico cosas ocurrieron o no de acuerdo con la expectativa de

me gusta poner comentarios en mi código de prueba para recordarme que piense en cada una de esas cosas.Un ejemplo puede ayudar a aclarar: supongamos que tengo una clase de capa de servicio que utiliza dos clases de capa de proveedor, una de un sistema "antiguo" y una de un sistema "nuevo"; Estoy probando que el método que copia cosas viejas al nuevo sistema llama al método "CreateThing" una vez por cada elemento encontrado.

[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))); 
} 
Cuestiones relacionadas