unit-testing - 行为与基于状态的测试

标签 unit-testing mocking

我知道这个问题是宗教 war 的一部分,但我有以下情况:
我有一个对象,Responder调用对象 Updater 上的方法以应对不同的事件。我最近以这种方式分离测试:Updater 的基于状态的测试方法本身,以及 Responder 的基于行为的测试那叫它。也就是说,我 mock UpdaterResponder测试,只是为了确保它被调用。

我是否仍要测试应该在 Responder 中更新的对象的状态?测试而不是 mock Updater ?我喜欢我所做的,因为它需要更少的设置并且似乎可以更好地隔离测试。然而,这似乎与 Responder 的实现和预期行为相关联。至Updater .是不是太脆了?这是一个简化的例子。

最佳答案

如果我确实正确理解了您的问题,您确实需要至少两个级别的测试:

  • 单元测试,您尝试仅测试一个类并模拟所有依赖项(因此在您的情况下,需要在此处模拟 Updater)。这些测试帮助您开发代码(尤其是在您使用 TDD 的情况下),确保该类的行为符合设计,甚至记录该类的行为方式。几乎每个类(class)都应该有单元测试。但是,正如您所注意到的,即使您有 100% 的测试覆盖率,您也无法保证您的程序可以正常工作甚至启动!
  • 验收、集成和端到端测试——这些测试覆盖整个应用程序或大模块,并测试一切是否协同工作。通常,您不会在此级别使用模拟(您可能会 stub 整个模块/Web 服务,具体取决于上下文)。这些测试不必测试每一个实现细节(也不应该),因为这是通过单元测试完成的。他们确保一切都正确连接并协同工作。在您的情况下,您不会在这里 mock Updater。

  • 所以总而言之,我认为你真的需要同时做这两个来正确测试你的应用程序。

    关于unit-testing - 行为与基于状态的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3514327/

    相关文章:

    swift - iOS RxSwift - 如何解包 `Optional<Optional<T>>` 或 `T??`?

    python比较两个列表,将每个失败视为独立失败而不是单一失败

    angular - 在 Angular TestBed 的另一个模块中覆盖组件

    ruby-on-rails - 如何 rspec 模拟 ruby​​ rails 记录器类

    java - 模拟 ColumnDefinitions.Definition 确实返回模拟,但在测试代码中表现得像 null

    ruby-on-rails - 测试时按特定顺序加载 Rails fixture

    visual-studio - Microsoft TestTools 的 UnitTesting 和 NUnit 之间有什么区别?

    c# - 在同一个模拟实例上断言对公共(public)方法的调用

    ios - OCMock:在本地声明的对象上模拟方法

    ruby-on-rails - 在 Rails 中测试范围链的最佳方法