是否可以使用MOQ模拟本地初始化对象?

时间:2013-12-01 14:41:14

标签: c# unit-testing tdd moq

我有以下代码:

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可以实现这一点。而且我也不喜欢采用“测试驱动开发”方法(这意味着我需要调整我的设计)。

1 个答案:

答案 0 :(得分:2)

不,你不能用Moq nor any other dynamic proxy based framework来嘲笑它。你不需要TDD(这与你的问题没什么关系) - 你应该看的是Dependency Injection(这会改变你的设计)。

您的代码的可测试版本需要factoryDB对象的抽象,例如:

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,这是解决此类问题的最常见方法。如果你想坚持现有的设计,你将不得不使用付费工具。