Pergunta

Eu sou novo para simulações e estou decidindo sobre um quadro simulada. A casa Moq citações

Atualmente, ele é o único zombeteiro biblioteca que vai contra a generalizada e um pouco unintuitive (Especialmente para principiantes) da ficha / Responder abordagem de todas as outras estruturas.

Alguém pode explicar simplesmente o que a abordagem Record / repetição é e como difere Moq? Quais são os prós e contras de cada especialmente do ponto de decidir um quadro?

Graças.

Foi útil?

Solução

A abordagem Record / repetição é suportado por RhinoMocks . A idéia básica é que a sua execução de teste é dividido em duas fases, a fase de registro e a fase de replay. Para ser um pouco mais concreto

var repo = new MockRepository();
var dependency = repo.DynamicMock<IDependency>();
With.Mocks(repo).Expecting(delegate {
         Expect.Call(dependency.AMethod(1)).Return(result);                    
      }).Verify(delegate {
         var sut = new Sut(wrappee);
         sut.DoStuffThatCallsAMethod();
         Assert.IsTrue(sut.ResultState);
      });

Assim, o bloco Esperando é a fase Record e o Verifique bloco é a fase de repetição.

A variante Moq deste código seria

var dependency = new Mock<IDependency>();
dependency.Expect(dep => dep.AMethod(1)).Returns(result);          
var sut = new Sut(wrappee.Object);
sut.DoStuffThatCallsAMethod();
Assert.IsTrue(sut.ResultState);

Que, como você pode ver é muito mais agradável de ler. Eu costumava usar RhinoMocks mas desde que eu descobri Moq Eu só uso Moq. Eu acho que ele seja produzir um código muito mais legível. Portanto, meu conselho seria ir para Moq.

Outras dicas

RhinoMocks é realmente muito versátil, você pode usar qualquer abordagem. RhinoMocks parece um pouco melhor do que Moq sob o estilo de espera / verificar. No entanto, mesmo o fato de que você pode usar este estilo está enterrado na documentação (última vez que olhei). Nós escolhemos Moq sobre RhinoMocks no meu projeto atual, porque nós não perceber que ele faz setup / verificar.

A sintaxe de gravação / reprodução dá-lhe a capacidade de alterar o valor que um método irá retornar em chamadas subseqüentes a esse método. Isso pode ser por vezes úteis. Dito isto, a necessidade de fazer isso é muitas vezes um cheiro que seu projeto não é muito justo. É útil embora quando você consegue ver o que está errado e você tem que seguir em frente.

Moq tem a capacidade de alterar o valor, mas é um pouco desajeitado (a partir da documentação)

// returning different values on each invocation 
var mock = new Mock<IFoo>(); 
var calls = 0; 
mock.Setup(foo => foo.GetCountThing())
.Returns(() => calls)
.Callback(() => calls++); 

Eu tenho direito saído Record / repetição porque torna mais difícil de ver na configuração que está apagou / ridicularizado ou apenas executar código. Acredito que Rhino tem múltiplas formas de trabalhar. Em particular, você pode usar um bloco using() configurar isolado de outras chamadas.

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