2009-07-01 16 views
7

Ich habe ein Objekt im Test, die einen ziemlich komplizierten Aufruf an ein Datenzugriffsobjekt macht. Es sieht so etwas wieAssertWasCalled in Rhino Mocks

object.DoSomething(somestring,someObject,someOtherObject,someOtherOtherObject)

In meinem Teststruktur ich eine verspottet Version des Objekts haben, und ich möchte testen, dass doSomething mit somestring genannt wurde == „value1“ und someObject.porpertyA == „Wert2“.

Ich kann nicht die einfache AssertWasCalled() - Überladung verwenden, weil ich nicht weiß, etwas über SomeOtherObject (oder kümmern sich). Ich bemerke eine weitere Überladung, die eine Aktion für Setup-Einschränkungen erfordert, aber ich habe sie noch nie benutzt.

Antwort

18

Stück des Kuchens:

yourstub.AssertWasCalled(
      x => x.DoSomething(
       Arg<string>.Is.Equal("value1"), 
       Arg<someObjectType>.Is.Equal(value2), 
       Arg<someOtherObjectType>.Is.Anything, <======== NOTE THIS! 
       Arg<someOtherOtherObjectType>.Is.Equal(value3) 
      ) 
); 
+4

thaat Werke Greaat. Die einzige andere Sache, die ich als nützlich empfand, war die Verwendung von Arg .Matches (y => y.property == was auch immer); zum Überprüfen von Werten für die Argumentobjekte. – captncraig

+0

Yup, ich weiß das, einfach nicht gezeigt, der Einfachheit halber. Genießen! – zvolkov

4

Werfen Sie einen Blick auf die documentation for constraints.

Ich vermute, Sie wollen:

Expect.Call(object.DoSomething(null, null, null, null) 
     .IgnoreArguments() // Ignore those nulls 
     .Constraints(Is.Equal("value1"), 
        Property.Value("PropertyA", "value2"), 
        Is.Anything(), 
        Is.Anything()) 
     .Return(whateverItShouldReturn);