c# - Stubbing una propiedad obtener utilizando Rhino Mocks
properties rhino-mocks (2)
Utilizando RhinoMocks, estoy tratando de Stub el valor getter de una propiedad. La propiedad se define como parte de una Interfaz con solo acceso getter.
Sin embargo, aparece el error "Llamada no válida, la última llamada se ha utilizado o no se ha realizado ninguna llamada (asegúrese de que está llamando a un método virtual (C #) / Anulable (VB))". Entiendo que esto puede significar que la propiedad que estoy aplastando no es virtual; Sin embargo, es parte de la Interfaz y no estoy seguro de si esa es la razón por la que recibo este error ...
A continuación se muestra el código del 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é en 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");
}
}
Dado que esta es una propiedad de solo lectura, debe decir:
stubRepository.Stub(x => x.StoreDeviceID).Return("test");
Normalmente con los apéndices, las propiedades se usan como las propiedades normales de C #. Entonces, para las propiedades que no son de solo lectura, dirías: stubRepository.someProperty = "test";
También tenga en cuenta que si desea configurar un método para comportarse de cierta manera, independientemente de si es un simulacro o un código auxiliar, siempre diría:
stubRepository.Stub(x => x.someMethod()).Return("foo");
Recuerde, los talones están ahí para suministrar las pruebas de unidad con las dependencias necesarias, pero no están ahí para ejecutar las verificaciones; para eso son las burlas
Use un talón cuando desee proporcionar una dependencia que se comporte de cierta manera. Use un simulacro cuando desee verificar que una determinada dependencia ha interactuado correctamente.
Desde el (destacado) Rhino Wiki :
Un simulacro es un objeto en el que podemos establecer expectativas, y que verificará que las acciones esperadas hayan ocurrido. Un código auxiliar es un objeto que utiliza para pasar al código bajo prueba. Puede establecer expectativas en él, por lo que actuaría de cierta manera, pero esas expectativas nunca serán verificadas. Las propiedades de un código auxiliar se comportarán automáticamente como propiedades normales, y usted no puede establecer expectativas en ellas.
Si desea verificar el comportamiento del código bajo prueba, usará un simulacro con la expectativa apropiada y lo verificará. Si solo quiere pasar un valor que puede necesitar actuar de cierta manera, pero no es el enfoque de esta prueba, usará un talón.
IMPORTANTE: un talón nunca hará que una prueba falle.
Puedes hacer lo siguiente con un talón:
stubRepository.Stub(x => x.StoreDeviceID).Return("test");
Esto hará que devuelva "prueba" para cualquier llamada al receptor de StoreDeviceID.