Ich versuche, eine Fälschung einer Objekt-Cache-Klasse zu erstellen, um in einem Test zu verwenden, und ich renne in seltsames Verhalten.CallTo funktioniert nicht in einer Schleife
ich damit begonnen: Der Test ein wenig aufzuräumen, indem die „callto“ -Aussagen zu einer Schleife
IObjectCache objectCache = A.Fake<IObjectCache>();
List<ICachedObject> objects = new List<ICachedObject>();
ICachedObject object1 = A.Fake<ICachedObject>();
A.CallTo(() => object1.Id).Returns(random.Next());
objects.Add(object1);
//Snip: Identical statements for object2 & object3...
A.CallTo(objectCache)
.Where(call => call.Method.Name == "get_Item")
//"get_Item" is the generated name for the indexer []
.WithReturnType<ICachedObject>()
.WhenArgumentsMatch((int objectId) => objectId.Equals(object1.Id))
.Returns(object1);
//Snip: Identical statements for object2 & object3...
//The lookup works as expected:
var x = objectCache[object1.Id]; //returns object1
var y = objectCache[object2.Id]; //returns object2
var z = objectCache[object3.Id]; //returns object3
Nach dass die Arbeit bekommen, die ich wollte. Wenn ich das mache, gibt die Fälschung jedoch nicht mehr die erwarteten Objekte zurück.
foreach (ICachedObject obj in objects)
{
A.CallTo(objectCache)
.Where(call => call.Method.Name == "get_Item")
//"get_Item" is the generated name for the indexer []
.WithReturnType<ICachedObject>()
.WhenArgumentsMatch((int objectId) => objectId.Equals(obj.Id))
.Returns(obj);
}
//Only the last object "added" works
var x = objectCache[object1.Id]; //returns a new, empty object
var y = objectCache[object2.Id]; //returns a new, empty object
var z = objectCache[object3.Id]; //returns object3
Ich frage mich, ob vielleicht die Argumente zu WhenArgumentsMatch & Returns nicht ausgewertet werden, bis sie durch den Indexer Lookup genannt werden und nur ein Wert halten kann. Gibt es einen anderen Weg, dies zu tun?
Geschafft! Das war genau das Problem. –
... Oder sogar 'objectCache [copy.Id] = copy;', wenn es einen Setter für den Indexer gibt. –
@BlairConrad tatsächlich, aber ich nahm an, dass der Indexer schreibgeschützt war. –