为了使您的代码可测试,您应该抽象控制器的依赖关系。使用存储库模式来抽象数据访问非常方便。将您的存储库注入控制器:
public class LocationController : Controller
{
private ILocationRepository _locationRepository;
public LocationController(ILocationRepository locationRepository)
{
_locationRepository = locationRepository;
}
}
现在您可以模拟您的存储库。这是使用Moq框架和MvcContrib的示例测试:
// Arrange
Mock<ILocationRepository> repository = new Mock<ILocationRepository>();
var controller = new LocationController(repository.Object);
Location location = new Location("New York);
// Act
var result = controller.Create(location);
// Assert
result.AssertActionRedirect()
.ToAction<LocationController>(c => c.Index());
repository.Verify(r => r.Add(location));
repository.Verify(r => r.Save());
你可以实现代码,这将通过这个测试:
[HttpPost]
public ActionResult Create(Location location)
{
if (ModelState.IsValid)
{
_locationRepository.Add(location);
_locationRepository.Save();
return RedirectToAction("Index");
}
}
您可以在此处阅读有关实现存储库和测试 MVC 应用程序的更多信息:
在 ASP.NET MVC 应用程序中实现存储库和工作单元模式。不错的功能也是每个请求都有工作单元。