c ++依赖注入来测试类系统调用的类

时间:2015-03-31 22:46:34

标签: c++ unit-testing dependency-injection

我正在尝试使用模板依赖注入来测试使用C系统调用来操作文件描述符的C ++类。 ideia是一个抽象类和一个实例来包装系统调用,如read(),write()等。然后我使用mock来测试我的目标类。 抽象类和系统调用看起来像:(我将省略参数以便清除)

class OSCall{
    read()=0;
    write()=0
};
class DefaultOSCall : public OSCall{
    read(){...}
    write(){...}
}

后来我在我想要使用它的类中注入了OSCall:

template<typename OSCall>
class FD{
    public:
        OSCall osCall_;
        OSCall &GetOSCall(){return osCall_;}

        read(){osCall_.read()}
        write(){osCall_.write()}
}

现在,如果我想使用模拟来测试我的FD类,我只需要在模板参数中传递我的模拟并使用GetOsCall获取模拟实例。

假设我想将FD用作另一个类的成员:

template<typename OSCall>
class User{
    public:
        DoSomething(){fd_.read();.......}
        OSCall &GetMemberOSCall(){return fd_.GetOSCall()}
    private:
        FD<OSCall> fd_;
}

如果我想用模拟测试用户,我可以使用GetMemberOSCall获取OSCall实例,它可以工作,但它是最好的方法之一吗?最后,我想向一个类成员注入一个模拟,并期望成员模拟的返回值。我希望我清楚自己。

由于

1 个答案:

答案 0 :(得分:0)

我建议您将GetMemberOSCall()重命名为getOSCall()

这似乎可以将其与模板类需要实现getOSCall()方法的通用模板结合使用,并且您可以使用FD<OScall>或{来实例化此模板{1}}。似乎是一种更灵活的方法。