我正在尝试使用模板依赖注入(inject)来测试使用C系统调用对文件描述符进行操作的C++类。想法是要有一个抽象类和一个实例来包装系统调用,如read(),write()等。然后,我使用一个模拟程序来测试我的目标类。
抽象类和系统调用看起来像:(我将省略参数以使其清晰)
class OSCall{
read()=0;
write()=0
};
class DefaultOSCall : public OSCall{
read(){...}
write(){...}
}
稍后,我将OSCall注入(inject)要使用的类中:
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实例,它可以工作,但这是执行此操作的最佳方法之一吗?最后,我想向类成员注入(inject)模拟,并期望成员模拟的返回值。我希望我能说清楚。
谢谢
最佳答案
我建议您将GetMemberOSCall()
重命名为getOSCall()
。
这似乎使它可以与通用模板结合使用,这些通用模板的模板类需要实现getOSCall()
方法,并且您可以使用FD<OScall>
或User<OScall>
实例化此模板。似乎是一种更灵活的方法。