ASP.NET MVC 2中的Moq和具体依赖性

时间:2010-11-19 21:29:44

标签: unit-testing asp.net-mvc-2 dependency-injection moq

我正在开发一个ASP.NET MVC 2项目。我已经交给了一些控制器类,它们严格依赖于数据存储库类,如下所示:

public class MyController : Controller
{
  MyRepository myRepository = new MyRepository();
  // ...
}

MyRepository是具体的,而不是接口。

基本上,虽然我有读取此代码的权限,但我没有写访问权限。我正在尝试编写一些单元测试以确保它有效。毋庸置疑,我不想让实际的数据库受到影响,所以显然有些嘲讽是有道理的。

我对单元测试和嘲讽相当陌生,但我已经阅读了Moq,我想我已经了解了它的工作原理。我已经能够成功创建一个简单的模拟存储库对象......但问题是,我仍然不知道如何将它传递到类中!

如果我编写原始代码,我会使用接口而不是具体类,我会为依赖注入编写额外的构造函数。事实上,我一团糟。

Moq可以帮助我将它传递给类(如果我模拟MyController),或者我是否需要请求写入权限以便我可以重构?

2 个答案:

答案 0 :(得分:2)

我建议您询问写访问权限并更改代码以使用构造函数注入。其他一切都是黑客攻击,不会给这段代码带来太多价值。只要一个类与其他类有很强的耦合,单元测试几乎是不可能的,即使你找到某种方法,这个测试也会非常脆弱,以至于浪费时间。

答案 1 :(得分:1)

你是正确的,为了正确地做到这一点,你需要有一个公开的方式注入你自己的存储库模拟。 Moq在这里不会帮到你。您应该尝试更改MyController代码以启用此类dependecny注入。

如果您无法对代码进行查询,则可以随时使用私有反射来更改内容。但这样做很脆弱,因为控制器实现的改变可能会破坏你的测试。

当然,您需要弄清楚如何模拟存储库。如果它不是为嘲弄而设计的,那么Moles之类的东西就可以起作用