我试图学习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?如何创建正确配置的存储库?我应该使用容器吗?
任何帮助,特别是代码示例都非常感谢!
提前致谢。
答案 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配置并从那里开始工作。