2012-08-24 32 views
6

Tôi muốn theo dõi một cuộc gọi đến một phương thức với Rhino Mocks. Giả sử tôi có mã này: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 
} 

Và thử nghiệm trông giống như:

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

Xét nghiệm này không thành công với một ExpectedViolationException vì khuôn khổ Rhino Mocks phát hiện 2 lớp C khác nhau.

Làm cách nào để kiểm tra cuộc gọi nếu đối tượng trong thử nghiệm tạo tham số đối tượng vào phương pháp đang thử nghiệm? Bất kỳ cơ hội nào để nói với Rhino Mocks để kiểm tra tham số là "Bằng"?

Cảm ơn rất nhiều!

Trả lời

12

tôi khuyên bạn nên sử dụng dễ dàng hơn nhiều (và dễ bảo trì hơn) cú pháp AAA. Trong hầu hết các trường hợp, mocks nghiêm khắc là nhiều hơn một nỗi đau hơn bất cứ điều gì khác.

đối số được so sánh bằng cách sử dụng Equals. Nếu C không ghi đè Equals, nó được so sánh theo tham chiếu và sẽ không khớp với trường hợp của bạn. Sử dụng Matches để kiểm tra đối số theo cách khác.

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

Xin chào, trình biên dịch nói: "Không thể chuyển đổi biểu thức lambda thành loại 'Rhino.Mocks.Constraints.AbstractConstraint' bởi vì nó không phải là một loại đại biểu." trỏ "x => x.Name =" myname "" – Jordi

+0

cố định phép gán bằng (=) để so sánh (==). –

+0

vẫn là vấn đề tương tự. Tôi đang thiếu cái gì đó? http://imageshack.us/f/708/errorah.png/ – Jordi

2

Bạn cần phải thêm IgnoreArguments và bổ sung có thể thêm contraints tham số cho cuộc gọi đến 'SomeCall':

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

cảm ơn bạn đời! lừa đẹp tôi đã học hôm nay. Vấn đề đó đã làm tôi thất vọng trong nhiều tuần. – Jordi

+1

Cú pháp này đã lỗi thời. Bạn nên sử dụng cú pháp AAA mới hơn, nơi bạn không cần tên thuộc tính trong chuỗi nữa. Một không có sử dụng để vượt qua một C mới nếu bạn bỏ qua các đối số trong dòng tiếp theo. –

Các vấn đề liên quan