Asp.net mvc 2 带有ASP.NET MVC 2、NUnit和Rhino Mock的TDD控制器
如果我使用Rhino Mocks、NUnit和ASP.NET MVC 2,那么一个简单的单元测试会是什么样的呢?我试图理解TDD的概念,但我看不出像“Controller XYZ Exists”这样的简单测试会是什么样子。此外,在视图下测试操作结果时,单元测试会是什么样子?为什么要测试控制器是否存在?您应该做的是测试控制器的行为。您的控制器是一个正在测试的代码,您对它提出了一些期望,然后断言是否满足了期望 关于如何使用ASP.NET MVC进行TDD,有许多演练。例如,您可以从这里开始 确认控制器存在 对其动作进行单元测试是控制器存在的一个强烈建议,这使我们想到: 单元测试看起来像什么 在视图外测试操作结果 下面是一个例子:Asp.net mvc 2 带有ASP.NET MVC 2、NUnit和Rhino Mock的TDD控制器,asp.net-mvc-2,tdd,nunit,rhino-mocks,Asp.net Mvc 2,Tdd,Nunit,Rhino Mocks,如果我使用Rhino Mocks、NUnit和ASP.NET MVC 2,那么一个简单的单元测试会是什么样的呢?我试图理解TDD的概念,但我看不出像“Controller XYZ Exists”这样的简单测试会是什么样子。此外,在视图下测试操作结果时,单元测试会是什么样子?为什么要测试控制器是否存在?您应该做的是测试控制器的行为。您的控制器是一个正在测试的代码,您对它提出了一些期望,然后断言是否满足了期望 关于如何使用ASP.NET MVC进行TDD,有许多演练。例如,您可以从这里开始 确认控
public class HomeController: Controller
{
private readonly IRepository _repository;
public HomeController(IRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
var customers = _repository.GetCustomers();
return View(customers);
}
}
以及相应的单元测试:
[Test]
public void HomeController_Index_Action_Should_Fetch_Customers_From_Repo()
{
// arrange
var repositoryStub = MockRepository.GenerateStub<IRepository>();
var sut = new HomeController(repositoryStub);
var expectedCustomers = new Customer[0];
repositoryStub
.Stub(x => x.GetCustomers())
.Return(expectedCustomers);
// act
var actual = sut.Index();
// assert
Assert. IsInstanceOfType(typeof(ViewResult), actual);
var viewResult = (ViewResult)actual;
Assert.AreEqual(expectedCustomers, viewResult.ViewData.Model);
}
[测试]
public void HomeController\u Index\u Action\u应\u从\u Repo()获取\u客户\u
{
//安排
var repositoryStub=MockRepository.generateSub();
var sut=新的HomeController(repositoryStub);
var expectedCustomers=新客户[0];
寄存存根
.Stub(x=>x.GetCustomers())
.退货(预期客户);
//表演
var-actual=sut.Index();
//断言
Assert.IsInstanceOfType(typeof(ViewResult),实际值);
var viewResult=(viewResult)实际值;
AreEqual(expectedCustomers、viewResult.ViewData.Model);
}
有一些很好的特性,允许您模拟HttpContext,而且。我已经看到了,但它是错误的。每次测试的断言次数不得超过一次。此外,它更关注于存储库测试,而不是简单的控制器测试?在遥远的银河系中,这在某些情况下可能是有意义的,但对于控制器测试来说,这毫无意义。更重要的是,我使用的是ASP.NET MVC 2。我们是否假设您的控制器在运行时注册?在这种情况下,您不想要集成测试而不是单元测试吗?