2011-01-04 30 views
11

IMHO, Rhino Mocks đưa ra thông báo chẩn đoán không rõ ràng khi AssertWasCalled được sử dụng để xác minh rằng phương thức đã được gọi với đối số cụ thể.Rhino Mocks - AssertWasCalled: Cách cải thiện thông báo chẩn đoán không rõ ràng khi đối số không chính xác

Ví dụ:

interface ISomeInterface 
{ 
    void Write(string s); 
} 

[TestFixture] 
public class SomeTests 
{ 
    [Test] 
    public void WriteShouldBeCalledWithCorrectArguments() 
    { 
     // Arrange 
     var mock = MockRepository.GenerateMock<ISomeInterface>(); 
     var sut = new SomeClass(mock); 

     // Act 
     sut.DoSomething(); 

     // Assert 
     mock.AssertWasCalled(x => x.Write(Arg<string>.Is.Equal("hello"))); 
    } 
} 

Bây giờ, nếu thử nghiệm không thành công với bài này ...

Rhino.Mocks.Exceptions.ExpectationViolationException: ISomeInterface.Write (tương đương với chào); Dự kiến ​​# 1, Thực tế # 0.

... bạn không thể biết nếu nó không thành công vì

A. 'Viết' không bao giờ được gọi -hoặc-
B. 'Viết' được trong thực tế gọi nhưng với những lập luận không chính xác

Nếu B sẽ là nguyên nhân của sự thất bại thì nó sẽ rõ ràng hơn nhiều nếu thông điệp sẽ đọc một cái gì đó như thế này:

Rhino.Mocks.Exceptions.ExpectationViolationException: ISomeInterface.Write (string arg): Phương thức được gọi nhưng với argumen không chính xác ts: Dự kiến: hello, Thực tế: bye

Tôi có thể tự sửa lỗi này (bằng cách viết đối sánh tùy chỉnh cho Rhino theo cách nào đó) hay đơn giản là tôi phải viết mô hình thủ công cho điều này?

+1

Cân nhắc thử Moq và/hoặc thực hiện kiểm tra dựa trên trạng thái. http://code.google.com/p/moq/ – TrueWill

+0

Thật không may, Moq có cùng một vấn đề. – Chris

Trả lời

10

Tôi đã tìm thấy một giải pháp đơn giản bằng cách sử dụng "các trận đấu" cú pháp được cung cấp bởi Rhino:

[Test] 
public void WriteShouldBeCalledWithCorrectArguments() 
{ 
    // Arrange 
    var mock = MockRepository.GenerateMock<ISomeInterface>(); 
    var sut = new SomeClass(mock); 

    // Act 
    sut.DoSomething(); 

    // Assert 
    mock.AssertWasCalled(x => x.Write(Arg<string>.Matches(s => Equal(s, "hello")))); 
} 

private static bool Equal(string s1, string s2) 
{ 
    Assert.That(s1, Is.EqualTo(s2), "Unexpected argument"); 
    return true; 
} 

Chắc chắn, đó là một chút vụng về nhưng nó được công việc làm. Nếu có cách nào tốt hơn, hãy cho tôi biết.

+0

Bạn đang bỏ lỡ phần này: 'Mong đợi: xin chào, Thực tế: bye' từ OP. – jcollum

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