У меня есть модульные тесты, которые проверяют, не указано ли имя ребенка, а затем не сохраняют ребенка, а другой - если имя указано, то следует вызвать save. Я сделал красный / зеленый / рефакторинг, и это прошло. Я добавил новые тесты, которые делают то же самое для фамилии. Теперь тесты для имени не пройдены, потому что фамилия не указана. Я предоставил тестовый код ниже. Меня интересует, правильно ли я поступаю по этому поводу, или я просто должен исправить неверные тесты?
Кроме того, необходим интерфейс валидатора, потому что действительные изменения зависят от клиента, использующего программное обеспечение, в противном случае я бы кодировал эти проверки в сам класс Baby.
Обновление: Судя по немногим ответам, которые я уже получил, кажется, что я поступаю неправильно. Что я должен делать вместо этого, чтобы эта ситуация не возникала?
[TestMethod]
public void baby_is_not_saved_if_validation_fails() {
// arange
var validator = new Mock<IValidator<Baby>>();
var output = new ValidationCollection();
validator.Setup(v => v.IsValid(It.IsAny<Baby>(), out output)).Returns(false);
var unitOfWork = GetMock();
// act
var b = new Baby();
var svc = new BabyService(validator.Object, unitOfWork.Object);
svc.AddNewBaby(b);
// assert
unitOfWork.Verify(u => u.SaveChanges(), Times.Never());
}
[TestMethod]
public void baby_is_saved_if_validation_passes() {
// arange
var validator = new Mock<IValidator<Baby>>();
var output = new ValidationCollection();
validator.Setup(v => v.IsValid(It.IsAny<Baby>(), out output)).Returns(true);
var unitOfWork = GetMock();
// act
var b = new Baby();
var svc = new BabyService(validator.Object, unitOfWork.Object);
svc.AddNewBaby(b);
// assert
unitOfWork.Verify(u => u.SaveChanges(), Times.Once());
}
[TestMethod]
public void if_first_name_is_not_supplied_baby_is_not_added() {
// arrange
var validator = new DefaultBabyValidator();
var unitOfWork = GetMock();
// act
var b = new Baby();
var svc = new BabyService(validator, unitOfWork.Object);
svc.AddNewBaby(b);
// assert
unitOfWork.Verify(u => u.SaveChanges(), Times.Never());
}
Mock<IHealthUnitOfWork> GetMock() {
var uow = new Mock<IHealthUnitOfWork>();
var dbSet = new Mock<IDbSet<Baby>>();
dbSet.Setup(db => db.Add(It.IsAny<Baby>())).Returns(new Baby());
uow.Setup(u => u.SaveChanges()).Verifiable();
uow.SetupGet(u => u.Babies).Returns(dbSet.Object);
return uow;
}
[TestMethod]
public void if_first_name_is_supplied_baby_is_added() {
// arrange
var validator = new DefaultBabyValidator();
var unitOfWork = GetMock();
// act
var b = new Baby { FirstName = "Charles" };
var svc = new BabyService(validator, unitOfWork.Object);
svc.AddNewBaby(b);
// assert
unitOfWork.Verify(u => u.SaveChanges(), Times.Once());
}
[TestMethod]
public void if_last_name_is_not_supplied_baby_is_not_added() {
// arrange
var validator = new DefaultBabyValidator();
var unitOfWork = GetMock();
// act
var b = new Baby { FirstName = "Charles" };
var svc = new BabyService(validator, unitOfWork.Object);
svc.AddNewBaby(b);
// assert
unitOfWork.Verify(u => u.SaveChanges(), Times.Never());
}
}