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

标签 c++ c++11 tdd

假设我有一个类似如下声明的类 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/

相关文章:

c# - 您如何平衡框架/API 设计和 TDD

c++ - 为什么在函数体内定义的内置类型的未初始化对象具有未定义的值?

c++11 - 将 std::shared_ptr<T> 转换为 void*

c++ - header 包含导致代码执行变慢

c++ - 如果你在成员函数中执行 "delete this;"会发生什么?

c++ - C++ lambda或基于lambda基于签名的重载解析中的可选/忽略参数

ruby - 如何模拟 Net::HTTP::Post?

unit-testing - 测试所需行为与 TDD

c++ - 为什么未按顺序从 CMap 中检索元素

c++ - 在哪里定义了名称查找规则来查找最直接的名称声明?