2011-01-04 11 views
11

En mi humilde opinión, Rhino Mocks produce un mensaje de diagnóstico poco claro cuando se utiliza AssertWasCalled para verificar que se ha llamado un método con un argumento específico.Rhino Mocks - AssertWasCalled: Cómo mejorar el mensaje de diagnóstico no claro cuando los argumentos incorrectos

Ejemplo:

interface ISomeInterface 
{ 
    void Write(string s); 
} 

[TestFixture] 
public class SomeTests 
{ 
    [Test] 
    public void WriteShouldBeCalledWithCorrectArguments() 
    { 
     // Arrange 
     var mock = MockRepository.GenerateMock<ISomeInterface>(); 
     var sut = new SomeClass(mock); 

     // Act 
     sut.DoSomething(); 

     // Assert 
     mock.AssertWasCalled(x => x.Write(Arg<string>.Is.Equal("hello"))); 
    } 
} 

Ahora, si la prueba falla con este mensaje ...

Rhino.Mocks.Exceptions.ExpectationViolationException: ISomeInterface.Write (igual a hola); Número esperado 1, real # 0.

... no se puede saber si se produce un error porque

A. 'Escribir' Nunca se invoca -o-
B. 'Escribir' es, de hecho, invocado pero con el argumento incorrecto

Si B sería la causa de la falla, entonces sería mucho más claro si el mensaje se leería algo como esto:

Rhino.Mocks.Exceptions.ExpectationViolationException: ISomeInterface.Write (arg cadena): el método se llama, pero con los argumentos incorrectos ts: esperado: hola, real: bye

¿Puedo solucionar este inconveniente por mi cuenta (escribiendo correspondencias personalizadas para Rhino de alguna manera) o simplemente tengo que escribir un simulacro manual para esto?

+1

Considere probar Moq y/o hacer pruebas basadas en estado. http://code.google.com/p/moq/ – TrueWill

+0

Desafortunadamente, Moq tiene el mismo problema. – Chris

Respuesta

10

He encontrado una solución sencilla mediante el uso de la sintaxis "Partidos" proporcionado por Rhino:

[Test] 
public void WriteShouldBeCalledWithCorrectArguments() 
{ 
    // Arrange 
    var mock = MockRepository.GenerateMock<ISomeInterface>(); 
    var sut = new SomeClass(mock); 

    // Act 
    sut.DoSomething(); 

    // Assert 
    mock.AssertWasCalled(x => x.Write(Arg<string>.Matches(s => Equal(s, "hello")))); 
} 

private static bool Equal(string s1, string s2) 
{ 
    Assert.That(s1, Is.EqualTo(s2), "Unexpected argument"); 
    return true; 
} 

Claro, es un poco torpe, pero hace el trabajo. Si hay una mejor manera de hacerlo, házmelo saber.

+0

Te falta esta parte: 'Esperado: hola, real: adiós' del OP. – jcollum

Cuestiones relacionadas