tdd - BD/TDD : can dependencies be a behavior?

标签 tdd bdd

我被告知不要使用实现细节。依赖关系看起来像是一个实现细节。不过我也可以将其表述为一种行为。

示例:LinkList 依赖于存储引擎来存储其链接(例如 LinkStorageInterface)。构造函数需要传递一个已实现的 LinkStorageInterface 的实例才能完成其工作。 我不能说“shouldUseLinkStorage”。但也许我可以说“shouldStoreLinksInStorage”。

在这种情况下,“测试”正确的是什么?我应该测试它是否在商店中存储链接(行为)还是根本不测试它?

最佳答案

依赖关系本身不是预期的行为,但对依赖关系调用的操作肯定是预期的行为。您应该测试您(调用者)了解的内容,并避免测试需要您深入了解 SUT 内部工作原理的内容。

稍微扩展一下您的示例,假设我们的 LinkStorageInterface 具有以下定义(伪代码):

Interface LinkStorageInterface

  void WriteListToPersistentMedium(LinkList list)

End Interface

现在,由于您(调用者)正在为该接口(interface)提供具体实现,因此您可以完全合理地测试在调用 Save() 时调用 WriteListToPersistentMedium() LinkList 上的 方法。

测试可能如下所示,再次使用伪代码:

void ShouldSaveLinkListToPersistentMedium()

  define da = new MockLinkListStorage()  
  define list = new LinkList(da)

  list.Save()

  Assert.Method(da.WriteListToPersistentMedium).WasCalledWith(list)

end method

您已经测试了预期的行为,但没有测试 SUT 或模拟的实现特定细节。您希望(主要)避免测试的是:

  1. 调用方法的顺序
  2. 公开方法或属性,以便您可以检查
  3. 任何不直接涉及您正在测试的预期行为的内容

同样,依赖项是您作为类的使用者所提供的东西,因此您希望使用它。否则,一开始就有这种依赖是没有意义的。

关于tdd - BD/TDD : can dependencies be a behavior?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262906/

相关文章:

c# - 使用 MSpec 比较两个列表

javascript - 使用 Mocha 和 Sinon 测试 anchor 链接调用

ruby-on-rails - capybara 测试中日期选择器的问题

SQL:在处理 SQL 查询/ View /等时是否可以执行 TDD?

selenium - 是否有任何框架支持带有驱动程序管理的 selenium-webdriver 的行为驱动方法(bdd)?

jquery - Jasmine Clock 模拟和 JQuery 效果 'complete' 功能不能很好地配合

java - 如何确保一个字符串恰好有 n 次子串?

scala - 使用 TDD 学习 Scala

database-design - 在进行 TDD 和增量添加功能时,我是提前设计数据库还是在编码时添加表和列?

java - 如何为基于TDD的方法编写负面测试?