0

我试图学习MVC结合IoC和DI。在我的项目中,我也使用Castle,Automapper,NHibernate,NHibernateIntegration。单元测试MVC控制器

感谢Kozmic的优秀示例“ToBeSeen”应用程序,我认为我现在已经设置了很多解决方案。但是现在我想在控制器方法级别单元测试基本的保存操作。我只是没有得到如何去做这件事。我期望我的问题很简单,但我是一个新手在这个和任何帮助表示赞赏。

我有这样的dossiercontroller:

[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; 
     } 

正如你可以看到它需要一个repostitory,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(); 
     } 

在这里,我只是想给dossiermodel自动映射成一个档案,并使用存储库保存。

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

任何帮助,特别是代码示例是高度赞赏!

在此先感谢。

回答

0

如果你不想嘲笑任何东西,你需要实例化控制器构造函数所需的服务的具体版本。

例如

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

至于你是如何配置和实例化这些,你就基本上需要做到这一点的正是你的MVC应用程序是这样做相同的方式。

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

+0

谢谢!我是新来的,你有没有嘲笑你的例子?亲切的问候,海因 – Hein73

+0

模拟意味着你基本上建立了一个你的接口的假实例,并设置它返回预设的响应。您将需要使用图书馆嘲笑服务 - 我使用Rhino Mocks - 尽管我知道Moq很受欢迎。看看[link](http://hibernatingrhinos.com/open-source/rhino-mocks)为一个基本的例子。 – StanK

+0

所以,如果我明白了Mocking意味着我不会访问实际的数据库。但是,我怎么能单元测试控制器,看看它是否真的存在任何东西,如果我打电话给它?或者我不应该在控制器中调用实际的Save方法?现在我直接从控制器调用repository.save。这很聪明吗?或不? – Hein73