2010-12-06 10 views
0

Mein MSpec-Test wird bestätigen, dass eine bestimmte Methode mit einem Argument von (mindestens) einer gegebenen Länge aufgerufen wurde.RhinoMocks/AssertWasCalled: Überprüfung der Argumentlänge?

Diese Syntax die Behauptung versagt, trotz des Arguments (zur Laufzeit) mit einer Länge von 534 aufweist:

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

ExpectationViolationException: IFoo.Write ("{512}" like); Erwartete # 1, tatsächliche # 0.

Was habe ich falsch mit Like() Muster gemacht?

Antwort

0

Vielleicht hängt es mit der Version von RhinoMocks zusammen, die Sie verwenden? Ich verwende RhinoMocks Version 3.5.0.1337 und Like erkennt die Länge korrekt.

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

testet

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

Die Tests auch passieren, wenn ich .Expect() anstelle von .AssertWasCalled() übrigens verwenden.

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

Wenn passieren diese Tests für Sie und Sie sicher sind, über die Länge des Arguments dann sicher, dass Schreiben durch Ändern der Test

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

bearbeiten aufgerufen wird:

Die Tests auch mit RhinoMocks Version 3.6.0.0 übergeben

+0

Ich habe das Like in meiner Assertion anstelle meines Contexts/Setups verwendet. Ich habe die Dinge nach deinem Code geordnet, und mein Code funktioniert jetzt wie erwartet. Danke vielmals. – lance

0

Warum testen nicht die Länge des arguement direkt

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

Allgemeinen in Rhino spottet, wenn Sie bekommen "Expected # 1, # 0 Actual." Das bedeutet, dass es ein Problem mit Equals gibt, zum Beispiel, dass für ein Objekt keine Gleichheit implementiert wurde.

+1

Mein Verständnis von Arg.Text ist, dass es nur während der AssertWasCalled() -Aufruf ist? – lance