【发布时间】:2013-06-16 14:28:42
【问题描述】:
我只是在用 mvc 4 研究 tdd。
我有一个订单控制器,它在其构造函数中采用一个工作单元接口:
public OrdersController(IUnitOfWork db)
{
this.db = db;
}
//
// GET: /Orders/
public ActionResult Index()
{
return View(db.Orders.GetAll());
}
我对此 Index() 进行了几个测试。
[TestClass]
public class when_the_order_controller_index_action_executes
{
[TestMethod]
public void it_should_render_the_default_view()
{
var uow = new Mock<IUnitOfWork>();
var db = uow.Object;
var orders = new List<Order>()
{
new Order{CreatedDate = DateTime.Now.AddMonths( -3),OrderID = Guid.NewGuid()},
new Order{CreatedDate = DateTime.Now,OrderID = Guid.NewGuid()}
};
uow.Setup(r => r.Orders.GetAll())
.Returns(orders);
//arrange
var controller = new OrdersController(db);
//act
var result = controller.Index() as ViewResult;
//assert
Assert.AreEqual("", result.ViewName);
}
[TestMethod]
public void it_should_pass_orders_as_the_model()
{
var uow = new Mock<IUnitOfWork>();
var db = uow.Object;
var orders = new List<Order>()
{
new Order{CreatedDate = DateTime.Now.AddMonths( -3),OrderID = Guid.NewGuid()},
new Order{CreatedDate = DateTime.Now,OrderID = Guid.NewGuid()}
};
uow.Setup(r => r.Orders.GetAll())
.Returns(orders);
//arrange
var controller = new OrdersController(db);
//act
var model = ((ViewResult)controller.Index()).ViewData.Model as IEnumerable<Order>;
//assert
Assert.IsTrue(orders.Equals(model));
}
}
您会注意到,在用于创建 GetAll 可以返回的列表的两个测试中存在大量代码重复...
说一个可重用的函数来返回两个测试都可以调用的列表是好还是坏?
任何关于我编写的测试的一般建议也将不胜感激,因为我现在才接受 tdd 的爱!
【问题讨论】:
-
我现在也在学习 TDD,我只是在看你的代码,想知道我是否错过了模拟/测试的概念你为什么要麻烦实际把在您的第一次测试中将数据放入您的 OUW.db 模拟中?由于您需要将测试设置为模型的所有内容都是空的,因为您在第一种方法中测试的只是索引视图已返回给您;然后,您将涵盖 Index 操作在第二次测试中正确设置模型的测试。根本不想变得聪明,只是想知道我是否错过了一些概念?
标签: asp.net-mvc unit-testing c#-4.0 asp.net-mvc-4 tdd