单元测试MVC控制器

时间:2011-12-04 19:56:32

标签: model-view-controller unit-testing controller automapper castle

我试图学习MVC结合IoC和DI。在我的项目中,我还使用Castle,Automapper,NHibernate,NHibernateIntegration。

感谢Kozmic提供的优秀示例“ToBeSeen”应用程序,我想我现在已经解决了这个问题。但是现在我想在控制器方法级别上进行单元测试基本保存操作。我只是不知道如何去做这件事。我希望我的问题很简单,但我是新手,任何帮助都表示赞赏。

我有这样的档案控制器:

    [Authorize]
    [Transactional]
    public class DossierController : BaseController
    {
        private readonly IRepository repository;
        private readonly IMappingEngine mappingEngine;
        private readonly ILogger logger;

        public DossierController(IRepository repository, IMappingEngine mappingEngine, ILogger logger)
        {
            this.repository = repository;
            this.mappingEngine = mappingEngine;
            this.logger = logger;
        }

正如您所看到的,它需要一个转发,mappingengine和记录器。据我所知,所有这些都是在运行时配置和连线的。

接下来我有一个用于保存档案的控制器方法:

        [HttpPost]
        [ActionName("Dossier")]
        [Transaction]
        [AcceptVerbs(HttpVerbs.Post)]
        [AcceptParameter(Name = "button", Value = "save")]
        public ActionResult Dossier_Save(string button, DossierModel dossierModel, string returnUrl)
        {
            if (!Request.IsAuthenticated)
                return RedirectToAction("Index", "Home");

            if (!ModelState.IsValid) return View(dossierModel);

            Dossier dossier = mappingEngine.Map<DossierModel, Dossier>(dossierModel);

            repository.Save(dossier);

            return View();
        }

在这里,我只想将档案模型自动化为档案并使用存储库保存。

现在我想用Nunit进行单元测试。我不想模拟任何东西,我想从控制器级别进行真正的持久性测试。为此,我必须创建一个新的档案控制器并传递正确的参数。现在我输了。如何创建和配置参数,使它们的工作方式与Web应用程序完全相同。例如:如何在Unittest中创建正确配置的Automapper?如何创建正确配置的存储库?我应该使用容器吗?

任何帮助,特别是代码示例都非常感谢!

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您不想模拟任何内容,则需要实例化控制器构造函数所需服务的具体版本。

e.g。

IRepository repository = GetRepository();
IMappingEngine mappingEngine = GetMappingEngine();
ILogger logger = GetLogger();
DossierController controller = new DossierController(repository, mappingEngine, logger);
ActionResult rsult = controller.Save(...etc...);

至于如何配置和实例化这些,您基本上需要以与MVC应用程序完全相同的方式执行此操作。

如果您不确定MVC应用程序中的哪些位置正在配置中,我建议首先查看IoC配置并从那里开始工作。