2012-08-24 70 views
6

Vorrei tenere traccia di una chiamata a un metodo con Rhino Mocks. Supponiamo che io ho questo codice: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 
} 

E il test si presenta come:

// 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(); 

il test fallisce con un ExpectedViolationException perché quadro Rhino Mocks rileva 2 classi C distinte.

Come si verifica la chiamata se l'oggetto in esame crea il parametro oggetto nel metodo in prova? Qualche possibilità di dire a Rhino Mocks di controllare il parametro come "uguale"?

Grazie mille!

risposta

12

vi consiglio di utilizzare la sintassi AAA molto più facile (e più gestibile). Nella maggior parte dei casi, i furbetti rigorosi sono più un dolore che altro.

gli argomenti vengono confrontati utilizzando Equals. Se C non sostituisce Equals, viene confrontato per riferimento e non corrisponde nel tuo caso. Utilizzare Matches per verificare l'argomento in qualche altro modo.

// 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

Salve, il compilatore dice: "Impossibile convertire espressione lambda per digitare" Rhino.Mocks.Constraints.AbstractConstraint "perché non è un tipo delegato." puntando "x => x.Name =" myname "" – Jordi

+0

risolto l'assegnazione equals (=) al confronto (==). –

+0

ancora lo stesso problema. Mi manca qualcosa? http://imageshack.us/f/708/errorah.png/ – Jordi

2

è necessario aggiungere IgnoreArguments e possono inoltre aggiungere vincoli dei parametri per la chiamata 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

grazie amico! bel trucco che ho imparato oggi. Quel problema mi dava fastidio per settimane. – Jordi

+1

Questa sintassi non è aggiornata. Dovresti utilizzare la più recente sintassi AAA, in cui non hai più bisogno di nomi di proprietà nelle stringhe. Un non è utile per passare una nuova C se si ignorano gli argomenti nella riga successiva. –

Problemi correlati