我知道如何使用这些术语,但我想知道单元测试是否有伪造、模拟和存根的公认定义?如何为您的测试定义这些?描述一下你可能会用到它们的场景。
以下是我如何使用它们:
Fake:实现接口但包含固定数据且没有逻辑的类。只是根据实现返回“好”或“坏”数据。
Mock:实现接口的类,允许从特定方法动态设置返回值/抛出异常,并提供检查特定方法是否被调用/未调用的能力。
Stub:类似于模拟类,只是它不提供验证方法是否被调用的能力。
模拟和存根可以手工生成,也可以由模拟框架生成。假类是手工生成的。我使用模拟主要是为了验证我的类和依赖类之间的交互。一旦我验证了交互并在代码中测试替代路径,我就使用存根。我使用伪类主要是为了抽象出数据依赖关系,或者当mock /存根太乏味而每次都无法设置时。
Stub, Fakes和Mocks在不同的来源中有不同的含义。我建议你介绍一下你的团队内部术语,并就其含义达成一致。
我认为区分两种方法很重要:
-行为验证(暗示行为替换)
-最终状态验证(暗示行为模拟)
考虑发送电子邮件以防出错。当做行为验证时,你检查IEmailSender的Send方法是否执行了一次。并且您需要模拟此方法的返回结果,返回发送消息的Id。所以你说:“我期望Send会被调用。我只会为任何调用返回虚拟(或随机)Id”。这就是行为验证:
emailSender.Expect(es=> . send (anyThing)).Return((subject,body) => "dummyId")
在进行状态验证时,您需要创建实现IEmailSender的TestEmailSender。并实现发送方法-通过将输入保存到一些数据结构,将用于未来的状态验证,如一些对象的数组,然后它测试你将检查sentemail包含预期的电子邮件。这是状态验证:
断言。emailSender.SentEmails.Count AreEqual (1)
从我的阅读中,我了解到行为验证通常被称为mock。
状态验证通常被称为存根或假。