webentwicklung-frage-antwort-db.com.de

Mehrere übereinstimmende Moq It.Is <string> () Argumente

Ist es bei Moq gültig, mehr als ein übereinstimmendes Argument zu haben?

It.Is<string>() 

In diesem Beispiel soll der mockMembershipService einen anderen ProviderUserKey zurückgeben, abhängig vom angegebenen Benutzer.

mockMembershipService.Setup(
    x => x.GetUser(
      It.Is<string>(
        s => s.Contains("Joe")))
   .ProviderUserKey)
.Returns("1234abcd");


mockMembershipService.Setup(
  x => x.GetUser(
    It.Is<string>(
      s => s.Contains("Tracy")))
  .ProviderUserKey)
.Returns("5678efgh");

Das SetUp verwendet standardmäßig die zweite Anweisung, anstatt jede für sich zu bewerten.

65
Nicholas Murray

Ist das nicht verwirrend? Sie versuchen, die GetUser-Methode zu verspotten, legen jedoch die Returns-Eigenschaft für den Rückgabewert dieser Funktion fest. Sie möchten auch die Eigenschaft des Rückgabetyps basierend auf einer verspotteten Methode angeben.

Hier ist ein klarerer Weg:

mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>())
                     .Returns<string>(GetMembershipUser);

Hier ist eine Methode zum Erstellen des Mitgliedschaftsmodells:

private MembershipUser GetMembershipUser(string s)
{
    Mock<MembershipUser> user =new Mock<MembershipUser>();
    user.Setup(item => item.ProviderUserKey).Returns(GetProperty(s));
    return user.Object;
}

Dann schreiben Sie eine Methode zum Setzen dieser Eigenschaft:

private string GetProperty(string s)
{
    if(s.Contains("Joe"))
        return "1234abcd";
    else if(s.Contains("Tracy"))
        return "5678efgh";
}
43

Wenn Sie die Eingabe auf "Joe" und "Tracy" beschränken möchten, können Sie in It.Is<T>() mehrere Bedingungen angeben. So etwas wie

mockMembershipService.Setup(x => x.GetUser(It.Is<String>(s => s.Contains("Joe") 
                                                         || s.Contains("Tracy")))
    .Returns<string>(/* Either Bartosz's or Ufuk's answer */);
26
cadrell0

Aufeinanderfolgende Setup-Aufrufe machen frühere Setups ungültig.

Sie könnten Ihr Argument in Ihrem Rückruf verwenden:

mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>()).ProviderUserKey).Returns<string>(s =>
{
    if(s.Contains("Joe"))
        return "1234abcd";
    else if(s.Contains("Tracy"))
        return "5678efgh";
});

Wenn es für Sie wichtig ist, das übergebene Argument durchzusetzen, benötigen Sie auch It.Is<string>(...) anstelle von It.IsAny<string>(...).

14
Bartosz

Bitte überprüfen Sie Einführung in Moq> Übereinstimmende Argumente Dokumentation:

// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true); 


// matching ranges
mock.Setup(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true); 


// matching regex
mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");
3
Jaider