C ++ - 如何在没有dynamic_cast的情况下测试Factory<>

时间:2016-02-17 10:19:34

标签: c++ c++11 tdd

我们假设我有一个类似于以下方式声明的类:

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方法,但它仅用于测试目的,从工程角度来看这不好,所以我的问题是:

对于所有工程方面,我怎样才能(如果可以的话)正确测试这样的工厂?

1 个答案:

答案 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