我有以下代码:
public class DB
{
public virtual int GetNumbers()
{
return 42;
}
}
public interface ITestable
{
int TestMethod();
}
public class Testable : ITestable
{
public int TestMethod()
{
DB db = new DB();
return db.GetNumbers() + 20;
}
}
现在我想使用MOQ创建一个DB的模拟,这样每次创建和初始化DB时(就像在Testable.TestMethod中一样),它将使用模拟的数据库实例。
例如,也许我可以设置DB Mock,以便对于所有DB的实例,当调用GetNumbers方法时,它将返回12而不是42.这样Testable.TestMethod将返回32而不是62. / p>
我想知道MOQ是否可以处理这种情况?实际上我知道TypeMock Isolator和Microsoft Fakes Framework可以实现这一点。而且我也不喜欢采用“测试驱动开发”方法(这意味着我需要调整我的设计)。
答案 0 :(得分:2)
不,你不能用Moq nor any other dynamic proxy based framework来嘲笑它。你不需要TDD(这与你的问题没什么关系) - 你应该看的是Dependency Injection(这会改变你的设计)。
您的代码的可测试版本需要factory和DB
对象的抽象,例如:
public class Testable : ITestable
{
private readonly Func<IDb> dbFactory;
public class Testable(Func<IDb> dbFactory)
{
this.dbFactory = dbFactory;
}
public int TestMethod()
{
var db = dbFactory();
return db.GetNumbers() + 20;
}
}
使用Moq,这是解决此类问题的最常见方法。如果你想坚持现有的设计,你将不得不使用付费工具。