2010-12-06 36 views
0

Mon test MSpec va affirmer qu'une méthode donnée a été appelée avec un argument de (au moins) une longueur donnée.RhinoMocks/AssertWasCalled: vérification de la longueur de l'argument?

Cette syntaxe ne parvient pas l'affirmation, en dépit de l'argument (à l'exécution) d'une longueur de 534:

_foo.AssertWasCalled(x => x.Write(Arg.Text.Like(".{512,}"))); 

ExpectationViolationException: IFoo.Write ("{512,}" comme); Prévu # 1, Réel # 0.

Qu'est-ce que j'ai fait de mal avec le patron de Like()?

Répondre

0

Peut-être est-ce lié à la version de RhinoMocks que vous utilisez? J'utilise RhinoMocks version 3.5.0.1337 et Like détecte la longueur correctement.

public interface IFoo 
{ 
    void Write(string value); 
} 

public class Bar 
{ 
    private readonly IFoo _foo; 

    public Bar(IFoo foo) 
    { 
     _foo = foo; 
    } 
    public void Save(string value) 
    { 
     _foo.Write(value); 
    } 
} 

teste

private Bar _bar; 
private IFoo _foo; 


[SetUp] 
public void BeforeEachTest() 
{ 
    var mocker = new RhinoAutoMocker<Bar>(); 
    _bar = mocker.ClassUnderTest; 
    _foo = mocker.Get<IFoo>(); 
} 


[Test] 
public void Given_input_length_equal_to_that_required_by_Like() 
{ 
    CallSave("".PadLeft(512)); 
} 

[Test] 
public void Given_input_longer_than_required_by_Like() 
{ 
    CallSave("".PadLeft(513)); 
} 

[Test] 
[ExpectedException(typeof(ExpectationViolationException))] 
public void Given_input_shorter_than_required_by_Like() 
{ 
    CallSave("".PadLeft(511)); 
} 

private void CallSave(string value) 
{ 
    _bar.Save(value); 
    _foo.AssertWasCalled(x => x.Write(Arg.Text.Like(".{512,}"))); 
} 

Les tests passent aussi si j'utilise .Expect() au lieu de .AssertWasCalled() par la voie.

private void CallSave(string value) 
{ 
    _foo.Expect(x => x.Write(Arg.Text.Like(".{512,}"))); 
    _bar.Save(value); 
    _foo.VerifyAllExpectations(); 
} 

Si ces tests passent pour vous et vous êtes certain de la longueur de l'argument vérifier alors que écrire est appelé en changeant le test

_foo.AssertWasCalled(x => x.Write(Arg<specify type here>.Is.Anything)) 

modifier:

Les tests passer également avec RhinoMocks version 3.6.0.0

+0

J'utilisais le Like dans mon affirmation au lieu de mon contexte/configuration. J'ai arrangé les choses selon votre code, et mon code fonctionne maintenant comme prévu. Merci beaucoup. – lance

0

Pourquoi ne pas tester la longueur de la arguement directement

Assert.IsTrue(Arg.Text.Length >= 512); 

Généralement dans Rhino se moque quand vous obtenez "PRÉVU 1, réelle # 0." cela signifie qu'il y a un problème avec Equals, par exemple ne pas avoir implémenté equals sur un objet.

+1

Ma compréhension de Arg.Text est qu'il est disponible uniquement pendant l'appel AssertWasCalled()? – lance