我正在開始一個新項目(當然,重新啓動一個現有的項目),並嘗試採用TDD(第n次)來獲得它應該帶來的所有好處。TDD'ing MVC控制器驅動設計
我相信TDD會導致我的測試驅動我只寫我需要寫的代碼,但它會促使我編寫我需要的代碼,而不會留下一些代碼。
這是我目前不確定性的狀態進來
考慮故事:
「的用戶必須能夠添加窗口小部件,這樣做,他們被帶到查看的新細節添加小部件「。
好吧,所以在UI上工作(因爲這是用戶將從中添加它們的小部件,而不是使用Visual Studio和我編寫的一組程序)...我從以下測試開始,編寫最小化,以便測試通過。
所以我開始與控制器拋出一個NotImplementedException,然後返回一個View()...以下是我寫了最少的線,我可以使測試通過第一點。
[TestFixture]
public class WidgetControllerTester
{
[Test]
public void Create_IfBusinessModelIsValid_ReturnRedirectToRouteResultToDetailsAction()
{
// Arrange
var currentUser = new User
{
DisplayName = "Fred",
Email = "[email protected]",
Password = "pass",
Status = UserStatus.Active
};
var model = new WidgetModel();
var controller = new WidgetController();
// Act
var actionResult = controller.Create(currentUser, model);
// Assert
actionResult.AssertActionRedirect().ToAction("Details");
}
}
public class WidgetModel
{
}
public class WidgetController: Controller
{
public ActionResult Create()
{
return View("Create");
}
[HttpPost]
public ActionResult Create(User currentUser, Widget model)
{
return RedirectToAction("Details");
}
}
現在我意識到無效模型和模型狀態檢查的附加測試將從其他故事演變而來。
但是我看不到一條清晰的路徑,我將如何利用附加測試來驅動控制器內的其他代碼。
例如,我知道在某些時候我會想要從Create操作進行WidgetService調用。我錯過了一些明顯的東西(不能夠看到樹木的東西)我如何通過額外的測試來實現控制器代碼?
談到WidgetService,我期望我會寫一個WidgetServiceTester,並且暫時引用控制器內的內容很可能會被嘲笑。
一些想法我有...
- 創建一個新的測試稱爲Create_IfModelIsValid_WidgetIsAddedToRepository,但如何這顯然導致到控制器中的行動服務電話?
- 我需要寫一個更詳細的故事,說明該模型需要插入到存儲庫/數據庫等?
- 我是否混淆了TDD和XP的元素?
感謝您的閱讀,我將不勝感激任何反饋意見和見解的最佳實踐進展。
喬。
編輯2010年2月27日
我發現下面的文章迭代#6 - 使用測試驅動開發(上asp.net)(http://www.asp.net/%28S%28ywiyuluxr3qb2dfva1z5lgeg%29%29/learn/mvc/tutorial-31-cs.aspx),這表明了那種我以後的事情,但是他們似乎考慮將控制庫/服務添加到控制器中作爲重新考慮......我個人不同意,我錯了嗎?:)
我打算考慮編寫一個檢查Details行爲的ViewData並更新這個問題的測試。