2016-04-17 2 views
2

In diesen Fällen ist es wichtig, It.Is <> Syntax zu verwenden, wenn Parameter an Moq setup übergeben werden, anstatt den Wert eines Parameters separat abzurufen dann es auf eine "einfache" Weise passieren? Bisher konnten meine Testanforderungen begrenzt sein, aber ich bin nicht auf die Notwendigkeit gestoßen, It.Is <> zu verwenden, die außerhalb der mock.Setup nicht definiert werden konnten? It.Is <> sieht sehr gut aus, wenn ich durch Quellen schaue, auch für solche grundlegenden Beispiele, also frage ich mich, was wäre der Vorteil. Unten ist ein einfaches Beispiel für die Kürze, aber auch bei anderen Fällen, auf die ich stieß, machte das keinen Unterschied. Ich meine:Moq - Verwenden von It.Is <> beim Übergeben von Parametern und Nichtverwendung

mockRepo.Setup(m =>m.GetAllReadingsOn 
(latestDate) 
.Returns(_filteredReadings); 

gegen

mockRepo.Setup(m => m.GetAllReadingsOn 
(It.Is<DateTime>(d => d ==_latestDate))) 
.Returns(_filteredReadings); 
+0

Mit einem konkreten Wert bedeutet, dass Sie den Anruf zu diesem konkreten Wert begrenzen . Es kann auf der anderen Seite mehrere (oder sogar beliebige) Werte zuordnen. Ehrlich gesagt, werden konkrete Werte nicht oft verwendet, und Sie könnten möglicherweise mehr darüber ausarbeiten, was Sie unter "einfaches Zurückholen und Übergeben" verstehen. –

+0

'd => d == _ latestDate' ist ein sehr einfaches Beispiel. Du könntest hier viel interessantere Dinge tun ... – wimh

Antwort

3

Ich würde immer den ersten Ansatz verwenden, da es kürzer ist. Es gibt eine Ausnahme: Referenztypen, mit denen nicht verglichen werden kann, weil die zu testende Methode sie erstellt. In diesem Fall müssen Sie Eigentum von Immobilien zu vergleichen, um sicherzustellen, dass das Verfahren erstellt und übergab eine Art korrekte Referenz:

mockRepo.Setup(m => m.GetAllReadingsOn(It.Is<SomeComplexObject>(x => 
    x.Foo == "foo" && 
    x.Bar == "bar" && 
    x.Baz == 123))) 
.Returns(_filteredReadings); 

dies gesagt ist, diesen Ansatz mit Werttypen verwenden, wie Datetime ist eine komplette Verschwendung von Tastatureingaben.


Wie in den Kommentaren angefordert hier ist ein einfaches Beispiel, wenn der erste Ansatz wird nicht funktionieren. Angenommen, wir die folgende Methode testen wollen:

public SomeResult FooBarBaz() 
{ 
    var myModel = new SomeComplexObject(); 
    myModel.Foo = "foo"; 
    myModel.Bar = "bar"; 
    myModel.Baz = 123; 
    var result = repository.GetTheResult(myModel); 

    return result; 
} 

Jetzt offensichtlich, wenn Sie versuchen, den folgenden Test zu schreiben, es kläglich scheitern wird:

// arrange 
var sut = new Sut(); 
var myModel = new SomeComplexObject(); 
myModel.Foo = "foo"; 
myModel.Bar = "bar"; 
myModel.Baz = 123; 
var expected = new SomeResult(); 
mockRepo 
    .Setup(m => m.GetAllReadingsOn(myModel) 
    .Returns(expected); 

// act 
var actual = sut.FooBarBaz(); 

// assert 
Assert.AreEqual(expected, actual); 
+0

Danke Darin, könntest du ein einfaches Beispiel teilen, wenn der erste Ansatz nicht funktionieren würde? – Turo

+0

Sicher, Lemme aktualisieren meine Antwort mit einem einfachen Beispiel. –

Verwandte Themen