Testen eines service mit mock-repository-Objekte
Ich bin testen eines service innerhalb eines Rahmens.
Zur Initialisierung der service, bin ich mit mock-repository-Objekte.
ServiceTest.cs
private IRepository _repository;
private IService _service;
private List<Object> _objects;
[TestInitialize]
public void Initialize()
{
_repository = new Mock<IRepository>().Object;
_service = new Service(repository);
_objects = new List<Object>()
{
new Object { Name = "random", ID = 1 },
new Object { Name = "not so random", ID = 1},
new Object { Name = "random", ID = 2 },
new Object { Name = "not so random", ID = 2}
};
//attempt at mocking the repository
_repository.Setup(r => r.GetObjects(It.IsAny<string>(), It.IsAny<int>())).Returns(_objects.Where(o => o.Name == _objects.Name && o.ID == _objects.ID).ToList());
}
[TestMethod]
public void GetObjects_ReturnObjectsList()
{
//Arrange
var name = "random";
//Act
var objects = _service.RetrieveObjects(name, 2);
//Assert
Assert.AreEqual(name, objects.Single().Name);
}
Allerdings, wenn ich den Dienst testen, ich bekomme ArgumentNullExceptions
. Die Variablen, die für die repository-Methode ruft zurück null
, und schließlich wirft einen Fehler, wenn die business-Logik ausgeführt wird.
Service.cs
public List<Objects> RetrieveObjects(string name, int id)
{
var getObjects = repository.GetObjects(name, id); //getObjects return null
DoLogic(getObjects); //ArgumentNullException is thrown here
return getObjects;
}
Habe ich nachgeschaut Informationen auf mocking-repositories, aber scheint, wie ich haben eine Menge zu setup, nur um zu testen. Ich Frage mich, ob das setup ist es Wert.
Warum bin ich immer ArgumentNullExceptions
? Gibt es eine Möglichkeit, test-Methoden, call-repositories?
- Was wollen Sie testen? Service-oder Repository? Sie sind Spott-Repository, und zu bekräftigen, was es gibt?!
- Oops, ich meinte service.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie gerade brauchen, um das Setup, was getestet wird, also in Ihrem arrangieren, tun Sie etwas wie:
repository
variable auf einIRepository
Objekt, sondern als var.new Mock<Repository>()
funktioniert nicht mitIRepository
..cs
Datei insgesamt? Ich habe setup eine Modell-repository und noch immer binnull
. Bitte siehe update..cs
Datei insgesamt? Ich habe setup eine Modell-repository und noch immer binnull
. Bitte siehe update.getObjects
übergeben wird in DoLogic, es istnull
. Dies war der Fall, bevor die Tatsache. Machte keine Fortschritte, so weit in dieser Hinsicht. Die repository-Klassen wurden unit-gründlich getestet und bin nun auf das testen der Dienste im Rahmen.Sollten Sie testen Ihr SUT (subject under test) in isolation. Versuchen Sie nicht zu verspotten vorhandenen Klassen, Schnittstellen verwenden nur. So sind Sie nicht abhängig von anderen Objekten, die potenziell buggy. Oft werden Sie nicht in der Lage, um das setup-Rückrufe und Rückgaben von vorhandenen Klassen, die als verspottet. Mocking-Schnittstellen ermöglicht es Ihnen, zu kontrollieren und vorherzusagen, die Werte zurückgeben.
So, in Ihrem Fall, die Sie tun sollten, @ianaldo21 vorgeschlagen, würde ich nur ändern Sie die erste Zeile dazu:
und führen Sie dann das setup, und geben Sie das repository.Objekt-Service.
Anstelle der Geltendmachung der Zustand des SUT, sollten Sie testen das Verhalten und die Interaktionen des SUT mit anderen Objekten. So könnte man etwas wie dieses:
So, Sie brauchen oft viel weniger die Einrichtung für die tests.