2012-08-24 43 views
6

Chciałbym śledzić wywołanie metody z Rhino Mocks. Załóżmy, że mam ten kod: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 
} 

a test wygląda następująco:

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

test nie powiedzie się z ExpectedViolationException ponieważ Rhino Mocks ramy wykrywa 2 odrębne klasy C.

Jak sprawdzić połączenie, jeśli badany przedmiot tworzy parametr obiektu w testowanej metodzie? Czy masz szansę powiedzieć Rhino Mocksowi, żeby sprawdzić parametr jako "Równy"?

Dziękuję za tonę!

Odpowiedz

12

polecam użyć znacznie łatwiejsze (i bardziej linkujących) składnię AAA. W większości przypadków ścisłe drwiny są większym bólem niż cokolwiek innego.

argumenty są porównywane za pomocą Equals. Jeśli wartość C nie zastąpi wartości Equals, zostanie porównana przez odniesienie i nie będzie pasować do Twojego przypadku. Użyj Matches, aby sprawdzić argument w inny sposób.

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

Cześć, kompilator mówi: "Nie można przekonwertować wyrażenia lambda na typ" Rhino.Mocks.Constraints.AbstractConstraint ", ponieważ nie jest to typ delegata." wskazując "x => x.Name =" myname "" – Jordi

+0

poprawiono przypisanie równe (=) do porównania (==). –

+0

wciąż ten sam problem. Czegoś mi brakuje? http://imageshack.us/f/708/errorah.png/ – Jordi

2

Trzeba dodać IgnoreArguments i może dodatkowo dodać contraints parametr dla wywołania „somecall”:

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

dzięki mate! fajna sztuczka, której nauczyłem się dzisiaj. Ten problem przez wiele tygodni mnie dręczył. – Jordi

+1

Ta składnia jest nieaktualna. Powinieneś użyć nowszej składni AAA, w której nie potrzebujesz już nazw właściwości w łańcuchach. Nie ma sensu przekazywać nowego C, jeśli zignorujesz argumenty w następnym wierszu. –

Powiązane problemy