什么时候使用存根和模拟?

asy*_*ait 9 unit-testing mocking stubbing

我一直都很困惑.如果我编写一个使用伪代码来断言某些操作的代码,那么当它真正使用真实对象而不是假对象时,我如何信任我的实际实现.

例如,我有这个代码 -

    [Test]
    public void CanCreateContactsWithData()
    {
        using(ISession session = factory.OpenSession())
        using (ITransaction trans = session.BeginTransaction())
        {
            _contactId = (long) session.Save(contact);
            trans.Commit();
        }

        Assert.AreNotEqual(0, _contactId);
    }
Run Code Online (Sandbox Code Playgroud)

此代码测试"联系"对象的实现,无论是否将其保存到数据库中.如果我碰巧使用存根而不是真正的数据库连接,我是否需要单独测试将其存储在数据库中?而且,你们称之为集成测试吗?

答案真诚地感谢.

小智 17

Martin Fowler 在这里有一个很好的讨论.

从他的文章:

Meszaros使用术语Test Double作为任何类型的假装对象的通用术语,代替用于测试目的的真实对象.这个名字来自电影中特技双人的概念.(他的目标之一是避免使用已经广泛使用的任何名称.)Meszaros然后定义了四种特殊的双重:

  • 虚拟对象传递但从未实际使用过.通常它们仅用于填充参数列表.
  • 假对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(内存数据库就是一个很好的例子).
  • 存根提供了在测试期间进行的调用的固定答案,通常不会对测试中编程的任何内容做出任何响应.存根还可以记录有关呼叫的信息,例如记住它'发送'的消息的电子邮件网关存根,或者可能只记录它'发送'的消息.
  • 模拟是我们在这里所讨论的:预编程的对象具有预期,形成了预期接收的调用的规范.

在这些双打中,只有嘲讽坚持行为验证.