Stubbing una propiedad obtener usando Rhino Burlas


Usando RhinoMocks, estoy tratando de obtener el valor getter de una propiedad. La propiedad se define como parte de una interfaz con solo acceso getter.

Sin embargo, recibo 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#) / Overridable (VB))."Entiendo que esto puede significar que la propiedad estoy intermitencia no es virtual; sin Embargo es parte de la Interfaz y no estoy seguro si esa es la razón por la que tengo este error..

A continuación se muestra el esqueleto de código. Si descomento la línea que dice "stubRepository.Stub (x = > x. StoreDeviceID).PropertyBehavior ();", entonces recibo un nuevo error "Property must be read/write". Busqué en SO y encontré esta 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");
        }
    }
Author: Community, 2011-08-09

2 answers

Dado que esta es una propiedad de solo lectura, debe decir:

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

Normalmente con stubs, las propiedades se usan como las propiedades normales de C#. Así que para las propiedades no solo de 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 trozo, siempre diría:

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

Recuerde, los stubs están ahí para suministrar sus pruebas unitarias con sus dependencias necesarias, pero no están ahí para ejecutar verificaciones en; eso es lo que las burlas son para.

Utilice un stub cuando desee suministrar una dependencia que se comporta de una manera determinada. Utilice un simulacro cuando desee verificar que se ha interactuado correctamente con una determinada dependencia.

De la (sobresaliente) Wiki de Rhino :

Un simulacro es un objeto en el que podemos establecer expectativas, y que verifique que las acciones esperadas hayan ocurrido efectivamente. Un trozo es un objeto que se utiliza para pasar a la código bajo prueba. Puedes las expectativas de configuración en él, por lo que actuaría de ciertas maneras, pero los las expectativas nunca serán verificadas. Las propiedades de un trozo se comportan automáticamente como las propiedades normales, y no se puede establecer expectativas sobre ellos.

Si desea verificar el comportamiento del código bajo prueba, use un simulacro con la expectativa adecuada, y verifique eso. Si solo quiere pasar un valor que puede necesitar para actuar de una cierta manera, pero no es el foco de en esta prueba, usarás un trozo.

IMPORTANTE: Un trozo nunca hará que una prueba falle.

 31
Author: Adam Rackis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-09 18:48:16

Puedes hacer lo siguiente con un trozo:

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

Esto hará que devuelva "test" para cualquier llamada al getter de StoreDeviceID.

 4
Author: Ryan Gross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-09 18:47:25