2011-08-09 13 views
20

Utilizando RhinoMocks, estoy tratando de anular el valor getter de una propiedad. La propiedad se define como parte de una interfaz con solo acceso getter.Obstaculizar una propiedad obtener usando Rhino Mocks

Sin embargo me sale el error "Llamada no válida, la última llamada se ha utilizado o no se ha hecho ninguna llamada (asegúrese de estar llamando a un método virtual (C#)/Overridable (VB))". Entiendo que esto puede significar que la propiedad que estoy cortando no es virtual; Sin embargo, es parte de la interfaz y no estoy seguro de si ese es el motivo por el que aparece este error ...

A continuación se muestra el código esqueleto. Si elimino el comentario de la línea que dice "stubRepository.Stub (x => x.StoreDeviceID) .PropertyBehavior();", aparece un nuevo error "La propiedad debe ser de lectura/escritura". Busqué SO y encontré this página. Pero la solución propuesta no me ayuda. ¿Alguna idea?

public interface IStore { 
     string StoreDeviceID {get;} 
     //other methods 
    } 

    public static class Store { 
     private IStore Repository; 

     public void SetRepository(IStore rep){ 
      Repository = rep; 
     } 

     public StoredeviceID { 
      get{ 
       return Repository.StoreDeviceID; 
      } 
     } 

     //other methods 
    } 

    public class TestClass { 
     [Test] 
     public void TestDeviceID() { 
      var stubRepository = 
       MockRepository.GenerateStub<IStore>(); 
      Store.SetRepository(stubRepository); 

      //stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior(); 
      SetupResult.For(stubRepository.StoreDeviceID).Return("test"); 

      Assert.AreSame(Store.StoreDeviceID, "test"); 
     } 
    } 

Respuesta

28

Como se trata de una propiedad de sólo lectura, es necesario decir:

stubRepository.Stub(x => x.StoreDeviceID).Return("test"); 

Normalmente con los talones, las propiedades se utilizan como propiedades normales de C#. Así que para las propiedades no sólo lectura, se podría decir: stubRepository.someProperty = "test";

También tenga en cuenta que si se quería establecer un métodoa comportarse de una manera determinada, independientemente de si se trata de una maqueta o un talón, que siempre decía:

stubRepository.Stub(x => x.someMethod()).Return("foo"); 

Recuerde, los talones están ahí para suministrar las pruebas unitarias con sus dependencias necesarias, pero son no existe para ejecutar las verificaciones sobre; para eso están los burlazos.

Utilice un stub cuando desee proporcionar una dependencia que se comporta de cierta manera. Use un simulacro cuando quiera verificar que se ha interactuado correctamente con cierta dependencia.

Desde el (excelente) Rhino Wiki:

A mock is an object that we can set expectations on, and which will verify that the expected actions have indeed occurred. A stub is an object that you use in order to pass to the code under test. You can setup expectations on it, so it would act in certain ways, but those expectations will never be verified. A stub's properties will automatically behave like normal properties, and you can't set expectations on them.

If you want to verify the behavior of the code under test, you will use a mock with the appropriate expectation, and verify that. If you want just to pass a value that may need to act in a certain way, but isn't the focus of this test, you will use a stub.

IMPORTANT: A stub will never cause a test to fail.

+0

@ Adam, ya que la propiedad es de solo lectura, no puedo configurarlo. Sin embargo, el fragmento de código que proporcionó a Stub la propiedad funciona perfectamente. Tonto, probé todas las demás opciones, excepto que :) – Santhosh

+0

StoreDeviceID no tiene un setter, por lo que su primera declaración 'stubRepository.StoreDeviceID =" test ";' no funcionará. –

+0

Ahh - lo siento. Actualizaré mi respuesta, me alegro de que hayas trabajado. –

4

Usted puede hacer lo siguiente con un talón:

stubRepository.Stub(x => x.StoreDeviceID).Return("test"); 

Esto provocará que vuelva "prueba" para cualquier llamada al captador de StoreDeviceID.

Cuestiones relacionadas