C# Moq der Liste: Hinzugefügte Objekte abrufen
Posted: 20 Jan 2025, 16:15
Ich habe die folgende Erweiterungsmethode für ein IQueryable erstellt, um sie in Entity Framework DbContext-MOQs in Komponententests zu verwenden
Das Problem, das ich habe, besteht darin, dass ich, wenn ich ein neues Element hinzufüge, es tatsächlich zur Quellliste hinzufüge, die nicht dasselbe Objekt wie Quelle. Das Durchlaufen der Elemente sollte also die Elemente der Quellliste zurückgeben.
Für die FirstOrDefault-Methode funktioniert dies jedoch nicht. Ich möchte einfach das ursprünglich angegebene Prädikat abrufen und es an die FirstOrDefault-Methode der Quellliste übergeben. Aber ich kann das nicht richtig einrichten.

Die Ausnahmemeldung sagt nur, dass das, was ich tue, ungültig ist, nicht, warum oder wie es sein sollte.
Code: Select all
public static DbSet BuildMockDbSet(this IQueryable source)
where T : class
{
var mock = new Mock();
var sourceList = source.ToList();
mock.As()
.Setup(x => x.GetAsyncEnumerator())
.Returns(new TestDbAsyncEnumerator(sourceList.GetEnumerator()));
mock.As()
.Setup(x => x.Provider)
.Returns(new TestDbAsyncQueryProvider(source.Provider));
mock.As()
.Setup(x => x.Expression)
.Returns(source.Expression);
mock.As()
.Setup(x => x.ElementType)
.Returns(source.ElementType);
mock.As()
.Setup(x => x.GetEnumerator())
.Returns(sourceList.GetEnumerator());
mock.Setup(s => s.AsNoTracking()).Returns(mock.Object);
mock.Setup(x => x.Include(It.IsAny())).Returns(mock.Object);
mock.Setup(x => x.FirstOrDefault(It.IsAny())).Returns((Expression x) => sourceList.FirstOrDefault(x as Func));
mock.Setup(d => d.Add(It.IsAny())).Callback((s) =>
{
sourceList.Add(s);
}).Returns((T v) => v);
return mock.Object;
}
Für die FirstOrDefault-Methode funktioniert dies jedoch nicht. Ich möchte einfach das ursprünglich angegebene Prädikat abrufen und es an die FirstOrDefault-Methode der Quellliste übergeben. Aber ich kann das nicht richtig einrichten.

Die Ausnahmemeldung sagt nur, dass das, was ich tue, ungültig ist, nicht, warum oder wie es sein sollte.