2009-02-23 5 views
21

Ist es möglich, Zugriff auf den Parameter zu erhalten, der zu dem Aufrufen eines gespiegelten Erwartungswerts bei dem Zusammenstellen des Objekts Rückgabe verwandt wird? HierZugriff auf die ursprünglichen Argumente von Expect() beim Assemblieren des Werts in Returns()

ist ein Stub für die beteiligten Objekte und, da, ich versuche, eine Sammlung zu verspotten:

Class CollectionValue { 
    public Id { get; set; } 
} 
Class Collection { 
    private List<CollectionValue> AllValues { get; set; } 
    public List<CollectionValue> GetById(List<int> ids) { 
     return AllValues.Where(v => ids.Contains(v.Id)); 
    } 
} 

eine Testliste von CollectionValues ​​gegeben, die für das verspottete Objekt verwendet wird, wie kann man Gehen Sie eine Erwartungshaltung ein, die jede mögliche Permutation der IDs in dieser Liste von CollectionValues ​​berücksichtigt, einschließlich der Aufrufe, die vorhandene IDs und nicht vorhandene IDs kombinieren? Mein Problem ergibt sich aus dem Wunsch, alle möglichen Erwartungen in einem einzigen Anruf zu stellen; Wenn der Zugriff auf den ursprünglichen Parameter nicht möglich ist, könnte ich genauso einfach die genaue Erwartung einstellen, die ich bei einem bestimmten Aufruf jedes Mal testen möchte.

Hier ist, was ich zu tun hoffte, wo "???" darstellt, wo wäre es nützlich sein, den Zugriff auf den Parameter GetById (derjenige, der die It.IsAny Beschränkung qualifiziert) verwendet zu haben, rufen:

CollectionMock.Expect(c => c.GetById(It.IsAny<List<int>>())).Returns(???); 

Antwort

61

Vom moq quickstart Führer:

// access invocation arguments when returning a value 
mock.Setup(x => x.Execute(It.IsAny<string>())) 
       .Returns((string s) => s.ToLower()); 

was darauf hindeutet, deshalb kannst du deine ??? als

CollectionMock.Expect(c => c.GetById(It.IsAny<List<int>>())) 
       .Returns((List<int> l) => //Do some stuff with l 
        );