2011-01-04 12 views
11

Rhino Mocksは、特定の引数でメソッドが呼び出されたことを確認するためにAssertWasCalledが使用されたときに不明瞭な診断メッセージを生成します。Rhino Mocks - AssertWasCalled:不正な引数があると不明確な診断メッセージを改善する方法

例:

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"))); 
    } 
} 

次に、テストがこのメッセージ...

Rhino.Mocks.Exceptions.ExpectationViolationExceptionで失敗した場合:ISomeInterface.Write(ハローに等しいです)。期待される#1、実際の#0。

A.「書き込み」は
B.「書き込み」、実際に呼び出される - または - しかし、間違った引数

で呼び出されることはありませんので、それが失敗した場合

...あなたが知ることができませんBは、障害の原因になる場合は、メッセージがこのような何かを読んでいましたならば、それはあまり明確に次のようになります。

Rhino.Mocks.Exceptions.ExpectationViolationException:ISomeInterface.Write(文字列引数):メソッドが呼び出されたが、間違った題名ts:期待:こんにちは、実績:bye

私はこの不具合を(何らかの方法でRhinoのカスタムマッチャーを書いて)修正することができますか、またはこれを手動で書く必要がありますか?

+1

Moqを試したり、状態ベースのテストを行うことを検討してください。 http://code.google.com/p/moq/ – TrueWill

+0

残念ながら、Moqには同じ問題があります。 – Chris

答えて

10

私はサイが提供する「マッチ」の構文を使用して簡単な解決策を見つけた:

[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; 
} 

確かに、それは少し不器用だが、それは仕事を取得します。それを行うより良い方法があるなら、私に知らせてください。

+0

あなたはこの部分が欠けている:OPからの「期待:こんにちは、実際:さようなら」。 – jcollum

関連する問題