依赖项本身不是预期的行为,但对依赖项调用的操作肯定是。您应该测试您(调用者)知道的内容,并避免测试需要您深入了解 SUT 内部工作的内容。
稍微扩展您的示例,让我们假设我们的 LinkStorageInterface 具有以下定义(伪代码):
Interface LinkStorageInterface
void WriteListToPersistentMedium(LinkList list)
End Interface
现在,由于您(调用者)正在为该接口提供具体实现,因此您可以在WriteListToPersistentMedium()
调用.Save()
LinkList
测试可能看起来像这样,再次使用伪代码:
void ShouldSaveLinkListToPersistentMedium()
define da = new MockLinkListStorage()
define list = new LinkList(da)
list.Save()
Assert.Method(da.WriteListToPersistentMedium).WasCalledWith(list)
end method
您已经测试了预期的行为,而没有测试您的 SUT 或您的模拟的实现特定细节。您想要避免测试的(主要)是:
- 调用方法的顺序
- 公开一个方法或属性,以便您可以检查它
- 任何不直接涉及您正在测试的预期行为的内容
同样,依赖项是您作为类的消费者提供的东西,因此您希望它被使用。否则,一开始就没有这种依赖关系。