我有一個單元測試,測試是否沒有提供寶寶的名字,然後不保存寶寶,另一個,如果第一個名字提供,然後保存應該被稱爲。我做了紅/綠/重構,並通過了。我添加了對姓氏做相同的新測試。現在名字的測試失敗了,因爲沒有提供姓氏。我已經提供了下面的測試代碼。我在想,如果我正在以這種錯誤的方式進行,或者我只是希望糾正破損的測試?新的測試導致舊的測試中斷,我做錯了嗎?
此外驗證器接口是必要的,因爲什麼是有效的更改取決於客戶端使用該軟件,否則我會將這些檢查編碼到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());
}
}
添加測試不應該打破其他測試。永遠。如果你改變你的代碼來通過一個新的測試,並打破舊的測試,那是不同的。 – Oded
我首先想到了。但他正在談論TDD。當他寫下現在失敗的測試時,並沒有要求姓氏。現在,姓氏的新要求打破了他的舊測試。我對自己對這個問題的回答很感興趣。 :) – vhallac
@vhallac - 即使使用TDD,當您在任何實現之前_write_一個_test_,新的_test_應該不會干擾現有測試(因爲尚未編寫新代碼)。如果是這樣,你做錯了什麼。 – Oded