1

如何对 MVC 应用程序执行单元测试?

我已经创建了控制器位置。它具有 LocationName、Area、City、PinCode 等属性。

现在,我想执行单元测试以检查 Location 是否保存在 DB 中。如何检查它。

我浏览了大量的视频,他们只是在每个地方都对数学运算进行单元测试,例如加法、除法、减法......

我想知道如何执行 MVC 的 Create 方法的单元测试

我有类似下面的代码

 [HttpPost]
    public ActionResult Create(Location location)
    {
        if (ModelState.IsValid)
        {
            db.Locations.Add(location);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }
    }
4

1 回答 1

3

为了使您的代码可测试,您应该抽象控制器的依赖关系。使用存储库模式来抽象数据访问非常方便。将您的存储库注入控制器:

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 应用程序中实现存储库和工作单元模式。不错的功能也是每个请求都有工作单元

于 2012-07-26T08:43:47.813 回答