2012-03-27 19 views
3

Ich möchte eine Funktion stub, die 2 boolesche Parameter erhalten. Der erste ist erforderlich und der zweite ist optional. Wenn ich versuche, Arg.Is.Anyhing an die erste, aber ohne Informationen für die Sekunde zu senden, erhalte ich einen Fehler:Optionale Parameter mit einem Stub in RhinoMock

System.InvalidOperationException: Bei der Verwendung von Arg müssen alle Argumente mit Arg.Is, Arg.Text definiert werden , Arg.List, Arg.Ref oder Arg.Out. 2 Argumente erwartet, 1 wurden definiert. Hier

ist eine Probe meiner Klasse Stub:

public interface IOptionalParameterTester 
    { 
     bool IsValid(bool mustCheck, bool checkInDatabase = true); 
    } 

    public class OptionalParameterTester : IOptionalParameterTester 
    { 
     public bool IsValid(bool mustCheck, bool checkInDatabase = true) 
     { 
     if (checkInDatabase) 
      return true; 
     else 
      return false; 
     } 
    } 

Und hier ist eine Probe des Tests:

[Test] 
    public void ValidateProducerTest() 
    { 
    IOptionalParameterTester optionalParameter = MockRepository.GenerateStub<IOptionalParameterTester>(); 

    optionalParameter.Stub(x => x.IsValid(Arg<bool>.Is.Anything)).Return(true); 
    } 

In diesem Fall, wenn ich den Test ohne Fehler übergeben möchten , Ich muss die gleiche Information definieren, die für die erste (Arg.Is.Anything) oder einen bestimmten booleschen Wert wie wahr oder falsch.

Wenn ich etwas anderes als Arg.Is.Anything für den ersten Parameter eingestellt habe, habe ich keinen Fehler.

Ist es ein Fehler?

Kann ich in RhinoMock eine Option einrichten, damit für jeden optionalen Parameter kein Wert definiert werden muss?

Wenn es keine Einrichtung gibt, gibt es eine bessere Lösung für diesen Fall (Best Practice, Pattern, etc.)?

Vielen Dank.

+1

Als Referenz http://stackoverflow.com/questions/6669623/c-sharp-mocking-framework-that-supports-optional-parameters-and-net-4-0 –

+0

Thanx für die Informationen. Ich liebe Moq, aber das Projekt, in dem ich zurzeit arbeite, ist RhinoMock. – Samuel

Antwort

1

Ich denke, ich verstehe, was Sie versuchen zu tun, aber da es scheint, dass dies eine Einschränkung von Rhino Mocks ist (wir können zu dieser Schlussfolgerung aus der Fehlermeldung erhalten Sie) Ich würde vorschlagen, Ihre Teststrategie zu ändern .

Versuchen Sie Folgendes tun:

[Test] 
    public void ValidateProducerTest() 
    { 
    bool anyBooleanValue = true; 
    IOptionalParameterTester optionalParameter = MockRepository.GenerateStub<IOptionalParameterTester>(); 

    optionalParameter.Stub(x => x.IsValid(anyBooleanValue)).Return(true); 
    } 

Ich weiß, dass auf Ihrem Test möchten Sie Rhino Mocks den ersten Parameter ignorieren und dass es dauert das optionale zweite aber, abhängig von der Logik, die Sie testen wollen, nur hart Code den ersten Parameter und Rhino Mocks sollte sich nicht beschweren.

Solange in Ihrem Test ist klar, dass der Wert des ersten Parameters nicht relevant ist, dass Ihr Test gültig und lesbar ist.

+0

Danke für die Antwort. Ich denke, ich werde alle Parameter in diesem Fall einstellen, weil 'wahr' anstelle von Arg .Iss.Alles ist nicht was ich will. – Samuel

0

hatte gerade ein ähnliches Problem selbst, versuchen

optionalParameter.Stub(x => x.IsValid()).IgnoreArguments().Return(true);

0

Das ist ganz eine alte Frage ist jetzt, aber ich landete auf dieser Seite, weil ich Probleme mit AssertWasCalled und optionalen Parametern.

Schließlich löste ich mein Problem mit der folgenden Syntax auf dieser Seite gefunden: http://petermorlion.blogspot.com/2012/11/rhinomock-assertwascalled-vs.html.

string expectedMessage = "RhinoMocks baby!"; 
string actualMessage = "RhinoMocks dude!"; 
var fooMock = MockRepository.GenerateMock<ifoo>(); 
fooMock.Bar(actualMessage); 

var calls = fooMock.GetArgumentsForCallsMadeOn(x => x.Bar(string.Empty), o => o.IgnoreArguments()); 
Assert.AreEqual(1, calls.Count); 
var arguments = calls[0]; 
Assert.AreEqual(expectedMessage, arguments[0]);