【问题标题】:C++ Fake class with callbacks带有回调的 C++ 假类
【发布时间】:2011-01-05 10:14:38
【问题描述】:

如果我需要测试一个与 B 类接口的 C++ 类 A,而 B 类的调用稍后会启动对 A 的回调,那将是一个好的设计模式吗?
我需要完全控制这些回调 - 当它们被执行时和什么信息。

我使用Google TestGoogle Mock 作为我的测试框架。在 Google Mock 的介绍中,他们解释了 difference between a fake and a mock。看来我需要一个假的 B 类而不是模拟。
在他们的文档中,他们详细说明了如何拥有 non-trivial implementations of B's functions,但这并不能解决我控制从 B 到 A 的回调的要求。

更新:

  • 澄清一下:A 有回调。在 A 调用 B 的函数一段时间后,B 在 A 中启动回调函数。虽然并不重要,但在我的例子中,B 持有指向 A 的指针并调用预定义的接口函数(派生自纯虚类 A_abstract)。

【问题讨论】:

    标签: c++ unit-testing callback tdd


    【解决方案1】:

    如果回调调用是由B 或完全不同的代码进行的,则无需担心class A,只要回调中提供的所有信息都是正确的。

    这意味着,如果您的测试用例可以获取回调所需的所有信息,那么您可以在适当的时间从测试脚本中调用回调并为class B 使用模拟。


    如果class A 实际检查回调是由class B 执行的(到目前为止,这实际上是可以实现的),那么AB 类耦合太紧密,无法单独测试它们。那么你应该重新考虑它们是否真的应该是两个紧密耦合的类。

    【讨论】:

    • 你的前半部分似乎是解决方案,我仍然需要测试它。出于某种原因,我一直认为 B 必须触发 A。至少在我的情况下,B 或测试脚本是否调用 A 的回调并不重要。
    • 应该是这样。请记住,模拟不必重新识别真实代码,只要被测代码无法注意到或不关心差异。
    【解决方案2】:

    我不知道我是否很好地理解了你的问题,但似乎你想要的是the strategy pattern。只要在 B 中有一个 A_abstract 指针作为成员变量,就可以实现从 B 到 A 的回调。

    class A_abstract {
    
    public:
        virtual void work() = 0;
    };
    
    class B {
    
    private:
        A_abstract* _m_A_ptr;
    
    public:
        set_a_ptr(A_abstract* _APtr) { _m_A_ptr = _APtr; }
    
        void work() {  _m_A_ptr->work(); }
    };
    

    【讨论】:

      【解决方案3】:

      您是否考虑过使用 Qt(或其他人)的信号和插槽?与回调相比,我更喜欢对信号和槽进行推理,尽管(我认为)它们在功能上基本相同。

      -布莱恩-

      【讨论】:

      • 回调没有问题,但是QT的信号和槽有不同的功能。它们与发布者/订阅者模式非常相似。但由于 QT 注册回调的方式,它们稍差一些。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2012-02-07
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      相关资源
      最近更新 更多