msf*_*boy 3 database unit-testing mocking poco
我有一点困惑
来自wiki:"这意味着真正的模拟......对传递给方法的数据执行测试会调用为参数."
我从未使用过单元测试或模拟框架.我认为单元测试是针对自动化测试的,那么什么是模拟测试呢?
我想要的是一个替换我的数据库的对象,我可能会在以后使用,但仍然不知道我使用的是什么数据库或orm工具.
当我使用模拟程序执行我的程序时,我可以轻松地用POCO替换它们以使实体框架例如工作得非常快吗?
编辑:我不想使用单元测试,但使用Mocks作为实体+数据库的完全替代将是不错的.
是的,我觉得你有点困惑.
模拟框架用于创建"模拟"对象,这些对象基本上伪造了真实对象的部分功能,因此您可以在测试期间将它们传递给方法,而不必去创建用于测试的真实对象.
让我们来看一个简单的例子
假设您有一个'Save()'方法,它接受一个'Doc'对象,并返回一个'boolean'成功标志
public bool Save(Doc docToSave(){...}
Run Code Online (Sandbox Code Playgroud)
现在,如果要为此方法编写单元测试,则必须首先创建一个文档对象,并使用适当的数据填充它,然后才能测试"Save()"方法.这需要比你真正想做的更多的工作.
相反,可以使用Mocking框架为您创建一个模拟"Doc"对象.
框架之间的语法各种各样,但在伪代码中你会写这样的东西:
CreateMock of type Doc
SetReturnValue for method Doc.data = "some test data"
Run Code Online (Sandbox Code Playgroud)
模拟框架将创建一个Doc类型的虚拟模拟对象,在调用'.data'属性时正确返回"某些测试数据".
然后,您可以使用此虚拟对象来测试您的保存方法:
public void MyTest()
{
...
bool isSuccess = someClass.Save(dummyDoc);
...
}
Run Code Online (Sandbox Code Playgroud)
模拟框架确保当您的"Save()"方法访问dummyDoc对象上的属性时,将返回正确的数据,并且保存可以自然发生.
这是一个有点人为的例子,在这么简单的情况下,创建一个真正的Doc对象可能同样容易,但是通常在复杂的位软件中创建对象可能要困难得多,因为它依赖于其他东西,或者它要求首先创建其他东西.模拟删除了一些额外的重载,并允许您测试您尝试测试的特定方法,而不用担心Doc类的复杂性.
模拟测试只是使用模拟对象而不是真实对象的单元测试.模拟对象并未真正用作实际生产代码的一部分.
如果你想要一些代替你的数据库类的东西,以便你以后可以改变主意,你需要编写接口或抽象类来提供匹配你的保存/加载语义所需的方法,然后你可以填写几个完整的实现取决于您选择的存储类型.