在TDD中有两个概念:虚假对象和模拟对象.如果要测试的类与其他类或对象或数据库交互,则使用这两个概念...
我的问题是:两者有什么区别?我什么时候可以使用它们中的每一个?
编辑: 我找到了这个答案: 假装,嘲弄和剔除有什么区别?
但是我仍然对这两者之间的区别感到困惑:他们都创建了组件的实现,并为Fake实现了轻量级.但是,如果是假的话,"快捷方式"的"轻量级实施"是什么意思?Mock对象的工作方式与真实对象的工作方式有何区别?
如果我EXPECT_CALL
在同一个模拟对象上调用两次TEST_F
...怎么了?
期望是附加到模拟对象还是第二次调用会消除第一次调用的效果?
我发现After After Clause似乎暗示允许多次调用同一个mock + EXPECT_CALL.
如何使用 C# 中的 moq 库设置通用方法?如
Interface IA
{
void foo();
void Get<T>();
}
[Fact]
public void SetupGenericMethod()
{
var mock = new Mock<IA>();
mock.Setup(x=> x.Get<It.IsAny<???>()>()
}
Run Code Online (Sandbox Code Playgroud) 我想更好地使用NUnit来测试我编写的应用程序,但我经常发现我编写的单元测试有一个直接链接到开发机器上的环境或底层数据库.
让我举个例子.
我正在编写一个单独负责重写字符串的类,该字符串已由另一个应用程序存储在注册表中.密钥存储在HKCU\Software\CustomApplication\IniPath中.
我最终写的测试看起来像这样;
[Test]
public void GetIniDir()
{
RegistryReader r = new RegistryReader();
Assert.AreEqual(@"C:\Programfiles\CustomApplication\SomeDir", r.IniDir);
}
Run Code Online (Sandbox Code Playgroud)
但问题是字符串@"C:\ Programfiles\CustomApplication\SomeDir"现在真的是正确的.明天它可能已经改为@"C:\ Anotherdir\SomeDir",突然间,即使代码没有改变,也会破坏我的单元测试.
当我创建一个对数据库执行CRUD操作的类时,也会出现此问题.数据库中的数据可以随时更改,这反过来会使测试失败.因此,即使我的类完成了预期的操作,它也会失败,因为数据库会返回我最初编写测试时所拥有的更多客户.
[Test]
public void GetAllCustomersCount()
{
DAL d = new DAL();
Assert.AreEqual(249, d.GetCustomerCount());
}
Run Code Online (Sandbox Code Playgroud)
你们有没有关于编写不依赖周围环境的测试的技巧?
unit-testing ×5
c# ×2
boost-asio ×1
c++ ×1
googlemock ×1
googletest ×1
moq ×1
nunit ×1
sockets ×1
tdd ×1