2011-01-04 7 views
11

IMHO ile ilgili belirsiz tanı mesajı nasıl geliştirilir, Rhino Mocks, bir yöntemin belirli bir bağımsız değişkenle çağrıldığını doğrulamak için AssertWasCalled kullanıldığında belirsiz bir tanı iletisi oluşturur.Rhino Mocks - AssertWasCalled: Yanlış argümanlar

Örnek:

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

Şimdi test bu iletiyle başarısız olursa ...

Rhino.Mocks.Exceptions.ExpectationViolationException: (eşit merhaba) ISomeInterface.Write; Beklenen # 1, Gerçek # 0.

A. 'Yaz'
B.'nin 'Write' aslında çağrılır -veya- ancak yanlış argüman

çağrılır asla çünkü başarısız olursa

... bilemezsiniz B başarısızlığın nedeni olurdu mesajı şöyle bir şey olsaydı o zaman çok daha net olacaktır:

Rhino.Mocks.Exceptions.ExpectationViolationException: ISomeInterface.Write (dize arg): Yöntem denirdi ama yanlış argüman ile ts: Beklenen: merhaba, Gerçek: bye

Bu kusurumu kendim giderebilir miyim (bir şekilde Rhino için özel eşleştiriciler yazarak) veya bunun için bir el yazması yapmak zorunda mıyım?

+1

Moq ve/veya eyalet tabanlı sınama yapmayı deneyin. http://code.google.com/p/moq/ – TrueWill

+0

Maalesef, Maliye aynı soruna sahip. – Chris

cevap

10

ben Rhino tarafından sağlanan "Maçlar" sözdizimini kullanarak basit bir çözüm buldum:

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

Tabii, bu biraz hantal ama işi alır. Bunu yapmanın daha iyi bir yolu varsa, lütfen bana bildirin.

+0

Bu bölümü kaçırıyorsunuz: 'Beklenen: merhaba, Gerçek: bye' OP'den. – jcollum