Pergunta

Eu tenho trabalhado em um wrapper para um objeto COM que só pode tomar e cordas de retorno. A interface para o objeto COM esta aparência:

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

aulas Agora que eu fiz que envolvem as funções básicas como assim:

    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")");}
        }

    }

Agora eu gostaria de fazer testes de unidade sobre essas classes sem ter que criar o objeto COM real a cada vez, configure o mundo, em seguida, executar os testes. Então, eu tenho procurado em usar objetos fictícios, mas estou um pouco confuso sobre como eu iria usar zombando nesta situação.

Estou pensando em usar Moq, então eu ter escrito este teste como este:

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

Esta é a maneira correta para zombar meu objeto COM? Como é que esta verdade que a cadeia se enviado para a função eval é a correta? ou estou fazendo tudo errado?

Foi útil?

Solução

Esta é uma duplicata? Como eu faria TDD com um objeto COM OLE

EDIT:. Parece que você está fazendo a mesma pergunta, mas para validar seu código de zombaria (OOPS)

Você não é completamente lá para o seu cenário zombeteiro. Você está no direito que você deseja isolar dependências externas, e seu objeto COM certamente atende a esse critério. Embora eu não sou um cara moq (eu prefiro RhinoMocks) a idéia por trás simulações é testes de interação ...

testes de interação é sobre como conjuntos coesos de objetos trabalhar juntos. Um teste válido neste cenário seria escrever um teste para o componente que é dependente do comportamento do seu objeto COM.

Neste caso, a sua "Tabela" que atua como um wrapper para o objeto COM, também é dependente do comportamento do objeto COM. Por causa do argumento, vamos dizer que seu objeto Tabela lógica executa costume contra os valores que são devolvidos a partir de seu objeto COM.

Agora você pode escrever testes isolados por seu objeto de mesa, enquanto simulando o comportamento do seu objeto COM usando 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();
   }
}

Talvez o seu objeto COM gera exceções quando ele é chamado, ou talvez ele não lidar com expressões de cadeia muito bem. Na verdade, estamos testando como nossos interage objeto de tabela com o IMapInfo sem estar vinculado a implementação do objeto COM. Também estamos impondo uma relação entre a tabela e IMapInfo em que o objeto IMapInfo deve ser chamado durante o teste.

Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top