Ich versuche zu testen, dass eine API-Controller-Methode nur Benutzer zurückgibt (plus einige zusätzliche Zustände, die hier nicht relevant sind), die basierend auf Name
wo Name = FirstName + ' ' + LastName
übereinstimmen.Wie richte ich einen Mock ein, der Ergebnisse basierend auf dem Wert eines Parameters dynamisch zurückgibt?
Ich habe ein Repository, das eine GetUsersByName(name)
Methode verfügbar macht. Ich möchte ein Setup für diese Repository-Methode, die eine List<UserModel>
mit Benutzern, die die Namen Kriterien aus einigen Stub-Liste von Benutzern (this.testUsers
) übereinstimmen zurückgeben.
Ich habe versucht, die folgenden:
this.mockUserReposiotry.Setup(r => r.GetAllUsersByName(It.IsAny<string>()))
.Returns(this.mockUtilities.MockUpUserModel(this.testUsers).Where(u => string.Concat(
u.firstName, " ", u.lastName)
.ToLower().Contains());
aber ich weiß nicht, wie die Klausel binden zurück zum IsAny<string>
enthält, die ich moq sage auf übereinstimmen.
Ist das möglich? Ich vermute, dass ich IsAny mit einem Parameter versorgen muss, aber ich kann keine ähnlichen Beispiele finden.
Ich bin nicht 100% sicher, dass Sie wirklich so auf diese Weise verspotten müssen. Gibt es eine wichtige Logik in Ihrem API-Controller, die von Daten abhängt, die von Ihrem Repository zurückgegeben werden? Z.B. Wenn das Repository Daten zurückgibt, die nicht zur Bedingung passen, behandeln Sie es im API-Controller? –
@ NKosis Antwort ist korrekt, aber als Faustregel sollten Sie zu viel Logik in einem gespielten Verhalten vermeiden. Ich würde willkürliche Werte von SetUp und Assert basierend auf diesen Werten zurückgeben. Nur ein Gedanke, ich kenne dein aktuelles Szenario nicht. –
@Nasmi Sabeer Generell stimme ich zu, aber diese spezifische Methode muss Werte basierend auf bestimmten Kriterien zurückgeben. Wenn ich diese Kriterien nicht vorher definiere, kann ich nicht sicher sein, dass sie in allen Variationen vorhanden sein werden, die ich brauche, wenn der Test ausgeführt wird. – Necoras