Ich versuche, über die Verwendung von Moq mit NUnit und IoC zu lernen.Den Daten Accessor ausspionieren
(Ich habe mein ganzes Projekt in BitBucket, aber nicht sicher, wie es zu teilen ...) https://bitbucket.org/Cralis/skeleton/overview
Ich habe eine Logic-Methode (Login) I zu testen, versuchen. Es braucht ein Anfrageobjekt (welches einen Benutzernamen, ein Passwort und eine IP-Adresse hat). Wenn der Benutzername und/oder das Kennwort leer sind, gibt die Logik einen Fehlerstatus zurück und geht nicht zur Datenzugriffsebene.
Also ich erstellen einen Komponententest, um dies zu testen. (Das ist mein mein erster Versuch mit spöttischen ...)
public void NotNull_Returns_True()
{
// Arrange
var request = new LoginRequest { IPAddress = "1.1.1.1", Username = "dummy", Password = "dummy" };
var response = new LoginResponse { Request = request, Success = true, Message = "", UserID = 1 };
// Setup the moc data accessor, as we don't want to gop to the concrete one.
var MockedDataAccess = new Mock<IDataAccess>();
// Set it's return value
MockedDataAccess.Setup(x => x.Login(request)).Returns(response);
// Instantiate the Logic class we're testing, using a Moc data accessor.
var logic = new BusinessLogic(MockedDataAccess.Object);
// Act
var result = logic.Login(new LoginRequest { Password = "dummy", Username = "dummy", IPAddress = "1.1.1.1" });
// Assert
Assert.AreEqual(true, result.Success);
}
Dies scheitert auf dem assert, als 'Ergebnis' ist NULL.
Ich mache wahrscheinlich viel falsch. Zum Beispiel bin ich mir nicht sicher, warum ich die Request- und Response-Objekte oben einrichten muss, aber da alle Beispiele, die ich finde, 'string' und 'int' Inputs sind, scheint es, dass ich It.IsAny nicht verwenden kann. ..
Könnte jemand mir helfen, hier zu verstehen? Was mache ich falsch, um NULL als Ergebnis in der Assert zu bekommen? Ich gehe durch und der Code wird wie erwartet ausgeführt. Aber das Ergebnis ist null, weil ich nie den Datenzugriffsmechanismus aufgerufen habe (es hat den Mock verwendet).
Edit: Ah,
// Set it's return value
MockedDataAccess.Setup(x => x.Login(It.IsAny<LoginRequest>())).Returns(response);
dass das Problem behoben. Ich bin mir nicht sicher, warum, also wenn Sie mir helfen können, dies zu verstehen und zu überarbeiten, so dass es so ist, wie es ein erfahrener Moq/UnitTester erwartet hätte, wäre das sehr nützlich.
Was ist Ihr 'Login' Methode tun? Ruft es Methoden für Ihre IDataAccess-Abhängigkeit auf und gibt null zurück, wenn diese Methoden null zurückgeben? –
@BenRubin - Ich habe einen Bitbucket-Link hinzugefügt, damit Sie alles sehen und klonen können. Wenn jedoch Nullwerte an die BL-Schicht gesendet werden, wird ein Response-Objekt ausgewertet und zurückgegeben, wobei das Erfolgsflag den Wert False hat. Es sollte niemals ein Null-Objekt zurückgeben. – Craig