2015-07-20 21 views
15

Ich versuche, ein Repository-Methode zu verspotten, wie dieMoq ReturnsAsync() mit Parameter

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

Moq ReturnsAsync verwendet wird, wie folgt aus:

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 line“... ReturnsAsync ((WhitelistType Typ ...):

nicht Lambda-Ausdruck konvertieren kann 'Model.WhitelistItem' weil es eingeben ist kein Typ Delegierter

WhitelistType ein Enum wie das ist:

public enum WhitelistType 
    { 
     UserName, 
     PostalCode 
    } 

ich nach Stunden gesucht und gefunden hatte keine Antwort auf mein Problem.

Irgendwelche Hinweise?

Antwort

32

ReturnsAsync hat keine Lambda-Version im Gegensatz zu Returns eins.

Fix: verwenden Returns mit Task.FromResult

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

sieht aus wie Sie den Typ für die Lambda-Delegierten Argumente (WhitelistType Typ, String-Wert) angeben müssen – BozoJoe

+0

ist es möglich, die Parameter zurück in das Verfahren als übergeben asynchrone Rückgabetyp, also Instanz in ---> Task aus? (selbe Instanz thou) – Choco

+0

@Choco nicht sicher, was Sie versuchen zu tun - in Betracht ziehen, es stattdessen als eine Frage zu stellen und tatsächlichen Code anzuzeigen (vielleicht suchen Sie nach 'return Task.FromResult (value)') ... –