控制器构造函数调用每个请求

时间:2009-09-04 08:44:47

标签: asp.net-mvc constructor httpwebrequest controller

我正在尝试测试一个只使用列表和创建的非常简单的表单。这是控制器:

public class PositionsController : Controller
{
    private readonly IPositionRepository _positions;

    // default constructor
    public PositionsController()
    {
        _positions = new TestPositionRepository();
    }

    // DI constructor
    public PositionsController(IPositionRepository positions)
    {
        _positions = positions;
    }

    // get a list of all positions
    public ActionResult Index()
    {
        return View(_positions.GetAllPositions());
    }

    // get initial create view
    public ActionResult Create()
    {
        return View();
    } 

    // add the new Position to the list
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Position positionToAdd)
    {
        try
        {
            _positions.AddPosition(positionToAdd);

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
}

TestPositionRepository只是我为了测试依赖注入而创建的模拟存储库。每当我尝试创建一个新条目时,我都会被发送回索引视图,但新条目不会添加到列表中。使用调试器,它显示每次单击链接或导航到控制器控件内的链接时都会调用构造函数。有没有办法解决这个问题?我觉得我做错了。我正在尝试做的是使用Ninject的依赖注入,但到目前为止我仍然坚持这个问题。

2 个答案:

答案 0 :(得分:9)

为什么这是一个问题 - 这是ASP.NET请求工作的方式。每个请求都会运行它自己的asp.net页面实例或MVC控制器,当请求完成后,控制器将被丢弃 - 请求之间不会持续这些事情。

因此,在您的create方法中,您应该在添加新位置后调用存储库的save / commit方法。

答案 1 :(得分:1)

在大多数情况下,MockRepository将是无状态的。这就是为什么你不会在索引中看到添加的条目。我会单独测试Index和Create。对于索引,我只会检查现有条目是否正确显示。这意味着你的MockRepository应该有一些硬编码的现有条目用于GetPositions - Method。

如果你想通过应用程序测试流程(Create + Index已经是什么),我会在真正的存储库上使用集成测试。