我正在开发一个ASP.NET MVC 2项目。我已经交给了一些控制器类,它们严格依赖于数据存储库类,如下所示:
public class MyController : Controller
{
MyRepository myRepository = new MyRepository();
// ...
}
类MyRepository
是具体的,而不是接口。
基本上,虽然我有读取此代码的权限,但我没有写访问权限。我正在尝试编写一些单元测试以确保它有效。毋庸置疑,我不想让实际的数据库受到影响,所以显然有些嘲讽是有道理的。
我对单元测试和嘲讽相当陌生,但我已经阅读了Moq,我想我已经了解了它的工作原理。我已经能够成功创建一个简单的模拟存储库对象......但问题是,我仍然不知道如何将它传递到类中!
如果我编写原始代码,我会使用接口而不是具体类,我会为依赖注入编写额外的构造函数。事实上,我一团糟。
Moq可以帮助我将它传递给类(如果我模拟MyController
),或者我是否需要请求写入权限以便我可以重构?
答案 0 :(得分:2)
我建议您询问写访问权限并更改代码以使用构造函数注入。其他一切都是黑客攻击,不会给这段代码带来太多价值。只要一个类与其他类有很强的耦合,单元测试几乎是不可能的,即使你找到某种方法,这个测试也会非常脆弱,以至于浪费时间。
答案 1 :(得分:1)
你是正确的,为了正确地做到这一点,你需要有一个公开的方式注入你自己的存储库模拟。 Moq在这里不会帮到你。您应该尝试更改MyController
代码以启用此类dependecny注入。
如果您无法对代码进行查询,则可以随时使用私有反射来更改内容。但这样做很脆弱,因为控制器实现的改变可能会破坏你的测试。
当然,您需要弄清楚如何模拟存储库。如果它不是为嘲弄而设计的,那么Moles之类的东西就可以起作用