2012-08-24 16 views
6

Me gustaría rastrear una llamada a un método con Rhino Mocks. Vamos a suponer que tengo este código:Rhino Mocks, VerifyAllExpectations

public class A 
{ 
    protected IB _b; 

    public A(IB b) 
    { 
     _b = b; 
    } 

    public void Run(string name) 
    {    
     _b.SomeCall(new C { Name = name }); 
    } 
}  

public interface IB 
{ 
    void SomeCall(C c); 
}  

public class C 
{ 
    public string Name { get; set; } 
    // more attributes here 
} 

Y la prueba se ve así:

// prepare 
var bMock = Rhino.Mocks.MockRepository.GenerateStrictMock<IB>(); 
bMock.Expect(x => x.SomeCall(new C { Name = "myname" })); 
var sut = new A(bMock); 

// execute 
sut.Run("myname"); 

// assert 
bMock.VerifyAllExpectations(); 

la prueba falla con un ExpectedViolationExceptionporque marco burla de Rhino detecta 2 clases C distintas.

¿Cómo verifico la llamada si el sujeto bajo prueba crea el parámetro del objeto en el método bajo prueba? ¿Alguna posibilidad de decirle a Rhino Mocks que verifique el parámetro como "Igual"?

Gracias a ton!

Respuesta

12

le recomiendo que utilice la sintaxis AAA mucho más fácil (y más fácil de mantener). En la mayoría de los casos, los simulacros estrictos son más dolorosos que cualquier otra cosa.

los argumentos se comparan usando Equals. Si C no anula Equals, se compara por referencia y no coincidirá en su caso. Use Matches para verificar el argumento de alguna otra manera.

// arrange 
var bMock = MockRepository.GenerateMock<IB>(); 
var sut = new A(bMock); 

// act 
sut.Run("myname"); 

// assert 
bMock.AssertWasCalled(x => x.SomeCall(Arg<C>.Matches(y => y.Name == "myname")); 
+0

Hola, el compilador dice: "No se puede convertir la expresión lambda para escribir 'Rhino.Mocks.Constraints.AbstractConstraint' porque no es un tipo de delegado". señalando "x => x.Name =" myname "" – Jordi

+0

se arregló la asignación igual a (=) a la comparación (==). –

+0

sigue el mismo problema. Me falta algo? http://imageshack.us/f/708/errorah.png/ – Jordi

2

es necesario agregar IgnoreArguments y puede añadir, además, contraints parámetros para la llamada a 'SomeCall':

bMock.Expect(x => x.SomeCall(new C { Name = "myname" })) 
    .IgnoreArguments() 
    .Constraints(new PropertyConstraint(typeof(C), "Name", 
     Rhino.Mocks.Constraints.Is.Equal("myname"))); 
+0

thanks mate! buen truco que aprendí hoy. Ese problema me estaba molestando por semanas. – Jordi

+1

Esta sintaxis no está actualizada. Debería usar la sintaxis AAA más nueva, donde ya no necesita nombres de propiedad en cadenas. No sirve de nada pasar una nueva C si ignoras los argumentos en la siguiente línea. –

Cuestiones relacionadas