Wie kann ich behaupten, dass ein Gerät getestet, die Methode True zurück?
Dies ist meine Domäne-Klasse
public partial class Department
{
public int DepartmentId { get; set; }
[Required]
public string DepartmentCode { get; set; }
[Required]
public string DepartmentFullName { get; set; }
public bool Status { get; set; }
public System.DateTime CreatedOn { get; set; }
}
In meiner MVC Anwendung, dies ist, wie mein DepartmentService
Klasse aussieht.
public class DepartmentService : IDepartmentService
{
private IUnitOfWork _UoW;
private IRepository<Department> repository;
public DepartmentService(IUnitOfWork UoW)
{
_UoW = UoW;
repository = _UoW.GetRepository<Department>();
}
public IList<Department> GetAllDepartments()
{
return repository.GetAll();
}
public bool SaveDepartment(Department newDepartment)
{
try
{
repository.Add(newDepartment);
_UoW.Save();
}
catch (Exception)
{
throw;
}
return true;
}
}
Schrieb ich einen unit-test für GetAllDepartments Methoden, wie unten beschrieben.
[Test]
public void When_GetAllDepartments_Is_Called_RepositoryGetAll_ShouldBeCalled()
{
//Arrange
var mockUnitOfWork = new Mock<IUnitOfWork>();
var mockRepository = new Mock<IRepository<Department>>();
mockUnitOfWork.Setup(x => x.GetRepository<Department>())
.Returns(mockRepository.Object);
var sut = new DepartmentService(mockUnitOfWork.Object);
//Act
sut.GetAllDepartments();
//Assert
mockRepository.Verify(x => x.GetAll());
}
Ich testen wollen SaveDepartment
Methode, wo, Wann-Abteilung ist erfolgreich gespeichert, es sollte true zurückgeben. Ich bin nicht in der Lage zu schreiben unit-Tests für diese.
Möchte ich auch testen, wenn DepartmentCode oder DepartmentFullName leer ist, und falls das Speichern versucht, wird eine Ausnahme geworfen werden sollte.
Dies ist, was ich habe, so weit.
[Test]
public void ShouldSucessfully_SaveNewDepartment()
{
//Arrange
var mockUnitOfWork = new Mock<IUnitOfWork>();
var mockRepository = new Mock<IRepository<Department>>();
Department newDept = new Department {
CreatedOn = DateTime.Now,
Status = true,
DepartmentFullName = "DFN",
DepartmentCode = "DC" };
mockUnitOfWork.Setup(x => x.GetRepository<Department>())
.Returns(mockRepository.Object);
var sut = new DepartmentService(mockUnitOfWork.Object);
//Act
sut.SaveDepartment(newDept);
//Assert
//???
}
bool result = sut.SaveDepartment(newDept); Assert.IsTrue(result);
?- Nicht sut.SaveDepartment(newDept); tatsächlich fügen Sie einen Datensatz in der DB ? Ich denke, dass ich nicht wollen, dass dies passiert. Oder sollte es passieren, in unit-Tests ?
- Sie wies die mock unitofwork, Euch wieder ein mock-repository. Solche repository nicht handeln auf die Datenbank
- Aktualisiert haben die OP. Wie kann ich testen, für einen Misserfolg ? Denn wenn DepartmentCode oder FullName fehlt, dann sollte die Ausnahme geworfen werden.
- Sorry, konnte Sie markieren als Antwort, wenn Sie zufrieden sind, indem Sie keine Antwort?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst - verschieben Sie alle gemeinsam arrangieren-code, um das SetUp-Methode:
Machen, dass die tests viel einfacher zu Lesen und zu verwalten. Nächste kleben nicht an der Umsetzung, wenn die Benennung des tests:
Was ist, wenn Sie umbenennen repository-Methode FindAll? Was ist, wenn service-Methode umbenannt werden? Test obsolet. Und niemand wird wissen, dass. Sie sollten beschreiben, WAS Ihr SUT stattdessen tun sollte, WIE:
Wie Sie sehen können, testen Sie Namen geändert. Auch ich überprüfen, verschiedene Dinge sind hier - nicht nur-repository genannt wurde (dass der check entfernt werden können, tatsächlich), aber das service liefert genau die gleichen Abteilungen, die es bekommt aus dem repository. Das ist, was service bedeutet. Und der zweite test:
Es überprüft, ob folgende service-Verhalten: der Dienst sollte pass im repository exakt gleichen Abteilung Instanz, die übergeben wurde, um Dienst, und es sollte true zurückgeben, es fordert auch sparen Arbeitseinheit zum senden von Daten.
BTW Wie man oben sehen kann, die ich verwenden helper-Methode um tests mehr sauber:
- Und bonus - überprüfen, dass der Dienst nicht speichert-Abteilung, die bereits vorhanden ist:
Wie Sie sehen können, die das erwartete Verhalten ist ganz einfach - bei der Einheit von Arbeit wirft NonUniqueEntityException während Abteilung speichern, sollte der Dienst "false" zurück. Ja, ich denke, es ist besser, um den Wert false zurück. Hier ist der service-code, die macht dieser test pass:
Entfernen Sie zuerst die redundanten try...catch.
Es gibt keinen Punkt, in dem abfangen einer Ausnahme nur zu rethrow es.
Soweit der test, den Sie fragte, für hier ist das snippet:
Es hängt davon ab, wer Sie erwarten, um zu prüfen, für diese Werte: wenn Sie möchten, verlassen Sie die Datenbank oder unitofwork zu prüfen, für diese Felder ist dies nicht der Vorrichtung zu testen, die für bestimmte Fehlerbedingungen möchten Sie einen unit-test. Hier sollten Sie nur testen, was passiert, wenn uow wirft Ausnahme.
Wenn Sie planen, fügen Sie diese check-in der Abteilung service als können Sie Folgendes tun:
vorausgesetzt, Sie verändert Ihre Methode wie folgt: