2011-01-04 18 views
11

IMHO, Rhino Mocks genera un messaggio diagnostico non chiaro quando si utilizza AssertWasCalled per verificare che un metodo sia stato chiamato con un argomento specifico.Rhino Mocks - AssertWasCalled: Come migliorare un messaggio diagnostico non chiaro quando argomenti errati

Esempio:

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

Ora, se il test non riesce con questo messaggio ...

Rhino.Mocks.Exceptions.ExpectationViolationException: ISomeInterface.Write (pari a ciao); Previsto # 1, effettivo # 0.

... non si può sapere se non riesce a causa

A. 'scrittura' non viene mai richiamato oppure
B. 'scrittura' è infatti invocato, ma con l'argomento errato

Se B sarebbe la causa del guasto allora sarebbe tanto più chiaro se il messaggio avrebbe letto qualcosa di simile:

Rhino.Mocks.Exceptions.ExpectationViolationException: ISomeInterface.Write (stringa arg): Metodo è stato chiamato, ma con l'argumen errato Attesi: ciao, Actual: ciao

Posso risolvere io stesso questa lacuna (scrivendo abbinamenti personalizzati per Rhino in qualche modo) o devo semplicemente scrivere un manuale di simulazione per questo?

+1

Considera di provare Moq e/o eseguire test basati sullo stato. http://code.google.com/p/moq/ – TrueWill

+0

Sfortunatamente, Moq ha lo stesso problema. – Chris

risposta

10

ho trovato una soluzione semplice utilizzando la sintassi "Matches" fornita da 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; 
} 

Certo, è un po 'goffo ma ottiene il lavoro fatto. Se c'è un modo migliore per farlo, per favore fatemelo sapere.

+0

Ti manca questa parte: "Previsto: ciao, effettivo: ciao" dall'OP. – jcollum

Problemi correlati