2012-08-24 2 views
6

Rhino Mock으로 메소드 호출을 추적하고 싶습니다.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 
} 

과 같은 시험 본다 : 이제이 코드가 있다고 가정하자 코뿔소 모의 객체 프레임 워크는 2 개 별개의 C 클래스를 감지하기 때문에

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

테스트는 ExpectedViolationException 실패합니다.

테스트중인 피사체가 테스트중인 메소드에 객체 매개 변수를 만드는 경우 어떻게 호출을 검사합니까? Rhino Mocks에 매개 변수를 "같음"으로 확인하도록 할 수 있습니까?

감사합니다.

답변

12

난 당신이 훨씬 더 쉽게 (그리고 더 유지 보수) AAA 구문을 사용하는 것이 좋습니다. 대부분의 경우, 엄격한 조롱은 다른 어떤 것보다 고통 스럽습니다.

인수는 Equals을 사용하여 비교됩니다. CEquals을 덮어 쓰지 않으면 참조로 비교되며 귀하의 경우 일치하지 않습니다. 다른 방법으로 인수를 확인하려면 Matches을 사용하십시오.

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

안녕하세요, 컴파일러는 다음과 같이 말합니다. "람다 식을 델리게이트 형식이 아니기 때문에 'Rhino.Mocks.Constraints.AbstractConstraint'를 입력 할 수 없습니다." "x => x.Name ="myname "" – Jordi

+0

은 대입 (=)을 비교 (==)에 지정했습니다. –

+0

여전히 동일한 문제입니다. 나는 무엇인가 놓치고 있습니까? http://imageshack.us/f/708/errorah.png/ – Jordi

2

당신은 IgnoreArguments를 추가 할 필요가 추가적으로 'SomeCall'에 대한 호출에 대한 매개 변수 제약 조건을 추가 할 수 있습니다

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

감사합니다. 좋은 트릭 오늘 배웠습니다. 그 문제는 몇 주 동안 나를 괴롭혔다. – Jordi

+1

이 구문의 유효 기간이 만료되었습니다. 더 이상 문자열에 속성 이름이 필요없는 새로운 AAA 구문을 사용해야합니다. 다음 행의 인수를 무시하면 새 C를 전달할 용도가 없습니다. –