我们假设我有一个类似于以下方式声明的类:
class Node{
public:
template <typename Functor, typename... Args>>
Node(Functor functor, Args...);
void process();
private:
// placeholder etc.
};
通常,class用于将Functor
与参数绑定,并使用process
方法启动它。
现在让我们假设我们有一个工厂:
class Factory{
public:
Node getConfiguredNode(Settings settings);
};
现在的问题是,我没有办法测试getConfiguredNode
方法,因为我不知道什么Functor
类型存储在发动机罩内。
常规测试工厂就像:
class AbstractClass{
public:
virtual void doSomething(arguments...) = 0;
};
class Factory{
public:
AbstractClass& getConfiguredItem(Settings settings)
};
void testCase{
try{
dynamic_cast<ExpectedConcreteType&>(factory.getConfiguredItem(settings));
success();
}
catch(...){
fail()
}
}
我想有这样的东西,这适合给出的例子。
我可以添加getStoredTypeInfo
方法,但它仅用于测试目的,从工程角度来看这不好,所以我的问题是:
对于所有工程方面,我怎样才能(如果可以的话)正确测试这样的工厂?
答案 0 :(得分:0)
根据您将类型注册到工厂的方式,一个选项可能是模板化Factory类,以便它可以返回“Test”类型而不是“Node”类型。
这将使仿函数类型的注册保持一致,同时允许您仅在测试工具中实例化新的对象类型。
Factory<Node> myNodeFactory;
由您决定是否:
将节点封装在测试中
Factory<Test> myTestFactory; // Test object holds an instantiated Node
返回一对节点并测试
Factory< std::pair<Node,Test> > myTestFactory;
从两个工厂实例构建节点和测试
Factory<Node> myNodeFactory;
Factory<Test> myTestFactory; // Test receives a Node instance to test