Pregunta

He estado trabajando en un contenedor para un objeto COM que solo puede tomar y devolver cadenas. La interfaz para el objeto COM se ve así:

    interface IMapinfo
    {
        void Do(string cmd);
        string Eval(string cmd);
    }

Ahora he creado clases que envuelven funciones básicas como esta:

    public class Table 
    {
        IMapinfo MI;
        public string Name
        {
            //pass the command to the COM object and get back the name.
            get{return MI.Eval("TableInfo(1,1")");}
        }

    }

Ahora me gustaría hacer pruebas unitarias en estas clases sin tener que crear el objeto COM real cada vez, configurar el mundo y luego ejecutar las pruebas. Así que he estado buscando el uso de objetos simulados, pero estoy un poco confundido sobre cómo usaría las burlas en esta situación.

Estoy planeando usar Moq, así que escribí esta prueba así:

        [Test]
        public void MockMapinfo()
        {
            Moq.Mock<Table> MockTable = new Moq.Mock<Table>();
            MockTable.ExpectGet(n => n.Name)
                .Returns("Water_Mains");

            Table table = MockTable.Object;
            var tablename = table.Name;

            Assert.AreEqual("Water_Mains", tablename,string.Format("tablename is {0}",tablename));
            Table d = new Table();
         }

¿Es esta la forma correcta de burlarse de mi objeto COM? ¿Cómo verifica que la cadena que se envía a la función eval es correcta? o lo estoy haciendo todo mal?

¿Fue útil?

Solución

¿Es esto un duplicado? ¿Cómo haría TDD con un objeto COM OLE

EDITAR: Parece que estás haciendo la misma pregunta, pero para validar tu código de burla (OOPS).

No estás del todo allí para tu escenario burlón. Tiene razón en que desea aislar dependencias externas, y su objeto COM ciertamente cumple con ese criterio. Aunque no soy un tipo moq (prefiero RhinoMocks), la idea detrás de los simulacros es prueba de interacción ...

La prueba de interacción trata sobre cómo los conjuntos cohesivos de objetos funcionan juntos. Una prueba válida en este escenario sería escribir una prueba para el componente que depende del comportamiento de su objeto COM.

En este caso, su " Tabla " que actúa como un contenedor para su objeto COM, también depende del comportamiento del objeto COM. Por razones de argumento, supongamos que su objeto Table realiza una lógica personalizada contra los valores que devuelve su objeto COM.

Ahora puede escribir pruebas aisladas para su objeto Table mientras simula el comportamiento de su objeto COM utilizando Mocks.

public class Table
{
   public Table(IMapInfo map)
   {
      _map = map;
   }

   public string Name
   {
      get 
      {
        string value = _map.Eval("myexpression");
        if (String.IsNullOrEmpty(value))
        {
            value = "none";
        }
        return value;
      }
   }

   private IMapInfo _map;
}

[TestFixture]
public class TableFixture // is this a pun?
{
   [Test]
   public void CanHandleNullsFromCOM()
   {
       MockRepository mocks = new MockRepository(); // rhino mocks, btw
       IMapInfo map = mocks.CreateMock<IMapInfo>();

       using (mocks.Record())
       {
          Expect.Call(map.Eval("myexpression").Return(null);
       }

       using (mocks.PlayBack())
       {
          Table table = new Table(map);
          Assert.AreEqual("none", table.Name, "We didn't handle nulls correctly.");
       }

       mocks.verify();
   }
}

Tal vez su objeto COM arroje excepciones cuando se lo llama, o tal vez no maneja muy bien las expresiones de cadena. En realidad, estamos probando cómo nuestro objeto Table interactúa con IMapInfo sin estar vinculado a la implementación del objeto COM. También estamos imponiendo una relación entre Table e IMapInfo en que el objeto IMapInfo debe ser llamado durante la prueba.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top