模拟框架可以为我做这个吗?

时间:2010-02-21 19:25:39

标签: database unit-testing mocking poco

我有点困惑

来自wiki的

: “这意味着真正的模拟......对传递给方法的数据执行测试会调用参数。”

我从未使用过单元测试或模拟框架。我认为单元测试是针对自动化测试的,那么什么是模拟测试?

我想要的是一个替换我的数据库的对象,我可能会在以后使用,但仍然不知道我使用的是什么数据库或orm工具。

当我使用模拟程序执行我的程序时,我可以轻松地用POCO替换它们以使实体框架例如工作得非常快吗?

编辑:我不想使用单元测试,但使用Mocks作为实体+数据库的完全替代将是不错的。

2 个答案:

答案 0 :(得分:6)

是的,我觉得你有点困惑。

模拟框架用于创建“模拟”对象,这些对象基本上伪造了真实对象的部分功能,因此您可以在测试期间将它们传递给方法,而不必去创建用于测试的真实对象。

让我们来看一个简单的例子

假设你有一个'Save()'方法,该方法接受一个'Doc'对象,并返回一个'boolean'成功标志

public bool Save(Doc docToSave(){...}

现在,如果要为此方法编写单元测试,则必须首先创建一个文档对象,并使用适当的数据填充它,然后才能测试“Save()”方法。这需要比你真正想做的更多的工作。

相反,可以使用Mocking框架为您创建一个模拟'Doc'对象。

框架之间的语法各种各样,但在伪代码中你会写这样的东西:

CreateMock of type Doc
SetReturnValue for method Doc.data = "some test data"

模拟框架将创建一个Doc类型的虚拟模拟对象,在调用'.data'属性时正确返回“某些测试数据”。

然后,您可以使用此虚拟对象来测试您的保存方法:

public void MyTest()
{
    ...
    bool isSuccess = someClass.Save(dummyDoc);
    ...
}

模拟框架确保当您的“Save()”方法访问dummyDoc对象上的属性时,将返回正确的数据,并且保存可以自然发生。

这是一个有点人为的例子,在这么简单的情况下,创建一个真正的Doc对象可能同样容易,但是在复杂的位软件中,创建对象可能要困难得多,因为它有依赖性在其他方面,或者它要求首先创建其他东西。模拟删除了一些额外的重载,并允许您测试您尝试测试的特定方法,而不用担心Doc类的复杂性。

模拟测试只是使用模拟对象而不是真实对象的单元测试。模拟对象并未真正用作实际生产代码的一部分。

如果你想要一些代替你的数据库类的东西,以便你以后可以改变主意,你需要编写接口或抽象类来提供匹配你的保存/加载语义所需的方法,然后你可以填写根据您选择的存储类型,完成几个完整的实现。

答案 1 :(得分:2)

认为您正在寻找的是Repository Pattern。该链接适用于NHibernate,但一般模式也适用于Entity Framework。搜索到这一点,我找到了Implementing Repository Pattern With Entity Framework

这抽象了接口(或接口集)背后的实际O / RM的细节。

(我不是存储库方面的专家,所以如果有人拥有它们,请发布更好的解释/链接。)

然后,您可以在决定使用O / RM之前在初始开发期间使用模拟(隔离)框架或手工伪造假/存根。

Unit testing是您可以实现全部收益的地方。然后,您可以通过提供模拟或存根存储库来测试依赖于存储库接口的类。您不需要为这些测试设置实际的数据库,它们将非常快速地执行。测试会反复为自己付出代价,代码质量也会提高。