我有点困惑
来自wiki的: “这意味着真正的模拟......对传递给方法的数据执行测试会调用参数。”
我从未使用过单元测试或模拟框架。我认为单元测试是针对自动化测试的,那么什么是模拟测试?
我想要的是一个替换我的数据库的对象,我可能会在以后使用,但仍然不知道我使用的是什么数据库或orm工具。
当我使用模拟程序执行我的程序时,我可以轻松地用POCO替换它们以使实体框架例如工作得非常快吗?
编辑:我不想使用单元测试,但使用Mocks作为实体+数据库的完全替代将是不错的。
答案 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是您可以实现全部收益的地方。然后,您可以通过提供模拟或存根存储库来测试依赖于存储库接口的类。您不需要为这些测试设置实际的数据库,它们将非常快速地执行。测试会反复为自己付出代价,代码质量也会提高。