webentwicklung-frage-antwort-db.com.de

Moq ReturnsAsync () mit Parametern

Ich versuche, die Methode eines Projektarchivs so zu verspotten

public async Task<WhitelistItem> GetByTypeValue(WhitelistType type, string value)

verwenden Sie Moq ReturnsAsync wie folgt:

static List<WhitelistItem> whitelist = new List<WhitelistItem>();

var whitelistRepositoryMock = new Mock<IWhitelistRepository>();

whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny<WhitelistType>(), It.IsAny<string>()))
                                    .ReturnsAsync((WhitelistType type, string value) =>
                                    {
                                        return (from  item in whitelist
                                                where item.Type == type && item.Value == value
                                                select item).FirstOrDefault();
                                    });

aber ich erhalte diesen Fehler in der Zeile "... ReturnsAsync ((WhitelistType type ...):

Lambda-Ausdruck kann nicht in Typ 'Model.WhitelistItem' konvertiert werden, da es sich nicht um einen Delegattyp handelt

WhitelistType ist so eine Aufzählung:

public enum WhitelistType
    {
        UserName,
        PostalCode
    }

Ich habe stundenlang gesucht und keine Antwort auf mein Problem gefunden.

Irgendwelche Hinweise?

39
Daniel Medina

Ab Moq v4.5.28

Sie können ReturnsAsync mit Lambdas genau wie im Codebeispiel der Frage verwenden. Task.FromResult() muss nicht mehr verwendet werden. Sie müssen lediglich die Typen der Lambda-Delegatenargumente angeben . Ansonsten erhalten Sie die gleiche Fehlermeldung:

Lambda-Ausdruck kann nicht in Typ 'Model.WhitelistItem' konvertiert werden, da es sich nicht um einen Delegattyp handelt

Das folgende Beispiel funktioniert mit der neuesten Version von Moq:

whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny<WhitelistType>(), It.IsAny<string>()))
                                .ReturnsAsync((WhitelistType type, string value) =>
                                {
                                    return (from  item in whitelist
                                            where item.Type == type && item.Value == value
                                            select item).FirstOrDefault();
                                });

Vor Moq v4.5.28 (Antwort von Alexei Levenkov )

Sie müssen Returns mit Task.FromResult Verwenden:

.Returns((WhitelistType type, string value) =>
 {
     return Task.FromResult(
       (from  item in whitelist
           where item.Type == type && item.Value == value
           select item).FirstOrDefault()
       );
});
28
Paul Siersma