假设我有一个类似如下声明的类 Node:
class Node{
public:
template <typename Functor, typename... Args>>
Node(Functor functor, Args...);
void process();
private:
// placeholder etc.
};
一般来说,类是为了将 Functor
与参数绑定(bind),并使用 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
方法,但它仅用于测试目的,从工程角度来看这并不好,所以我的问题是:
关于所有工程方面,我如何(如果可以)正确测试这样的工厂?
最佳答案
根据您将类型注册到工厂的方式,一种选择是为您的工厂类创建模板,以便它可以返回“测试”类型而不是“节点”类型。
这将使仿函数类型的注册保持一致,同时允许您仅在测试工具中实例化新对象类型。
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
关于C++ - 如何在没有 dynamic_cast<> 的情况下测试工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35453829/