带回调的C ++ Fake类

时间:2011-01-05 10:14:38

标签: c++ unit-testing callback tdd

如果我需要测试一个与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派生)。 / LI>

3 个答案:

答案 0 :(得分:2)

如果回调调用是由class A或一些完全不同的代码进行的,只要回调中提供的所有信息都是正确的,

B就不应该担心。

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


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

答案 1 :(得分:0)

我不知道我是否理解你的问题,但似乎你想要的是the strategy pattern。只要你有一个A_abstract指针作为B中的成员变量,就可以实现从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(); }
};

答案 2 :(得分:0)

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

-Brian -