【问题标题】:How do I unit test a factory?如何对工厂进行单元测试?
【发布时间】:2011-06-23 07:37:55
【问题描述】:

我通过给我的所有类一个接口来对我的类进行单元测试。这些接口又拥有自己的模拟。

但是假设我有以下内容:

class IData
{
  GetData()
}

class IOnScreenDataCalculator
{
  Calculate(IData)
}

class OnScreenData : IOnScreenData
{
  OnScreenData(PTR_T(IData), PTR_T(IOnScreenDataCalculator))

    enter code here

  GetOnScreenData()
}

现在假设我希望有多个工厂用于不同类型的数据和计算器。我如何对这些工厂进行单元测试,我的工厂如下:

OnScreenBlueDataForWideScreenFactory
{
  PTR:T(IOnScreenData) Create()
  {
    PTR_T(Data) data = ptr_t(new BlueData());
    PTR_T(IOnScreenDataCalculator) calculator = ptr_t(new WideScreenDataCalculator());
    PTR_T(IOnScreenData) onScreenData = ptr_t(new WideScreenDataCalculator(data, calculator ));

    return onScreenData;
  }
}

感谢您的帮助,

巴里。

【问题讨论】:

  • c++ 代码在哪里? ;)

标签: c++ unit-testing tdd factory cppunit


【解决方案1】:

我不确定代码 sn-ps 是否真的是 c++,但示例应该是这样的:

class ExampleIface
{
  public:
    virtual ~ExampleIface() {}
    virtual void a() = 0;
};

class Example1: public ExampleIface
{
  public:
    virtual ~Example1() {}
    virtual void a()
    {
      // something
    }
};

class ExampleFactory
{
  public :
    typedef ExampleIface * ExamplePtrType; // can be shared_ptr instead

    static ExamplePtrType Create( /*params?*/)
    {
      ExamplePtrType p( new Example1 );
      return p;
    }

  private:
    ExampleFactory();
    ~ExampleFactory();
};

和单元测试:

void test_Create()
{
  ExampleFactory::ExamplePtrType p = ExampleFactory::Create();
  Example1 *realType = dynamic_cast< Example1* >( p );
  TS_ASSERT( NULL != realType ); // if you use cxxtest
}

【讨论】:

  • 谢谢!但是如果 Example1 依赖于它通过其构造函数接收到的东西呢?假设我在工厂中创建了这个东西,让那些希望简单地创建 Example1 而无需担心其背后的所有路由和魔法的人的生活更轻松?
  • @user607846 你的意思是使用控制反转?然后你必须把它传递给 Create 函数。那东西也应该从一个纯基类继承,以使事情更简单,更容易测试。
  • 但是工厂不应该让那些使用它的人生活得更轻松吗?他们应该关心争论吗?当我在 TDD 中编程时,我最终会得到大量的类,因此我需要工厂将它们捆绑在一起。如果工厂接受大量参数,是否存在由于用户没有深入了解工厂如何构建所有内容而导致他们收到错误参数的危险?
  • 例如,如果我有一个由另一个类在内部使用的默认计算器类。使用返回的工厂接口的人不感兴趣的计算器。我不应该在工厂中创建这个计算器吗?
  • @user607846 它可以是网络访问类或数据库访问,或任何东西,而不是计算器。那你将如何测试工厂?通过传递模拟,因此没有办法解决。如果您需要将许多对象传递给工厂,那么您很可能做错了什么。如果他们不明白一个类在做什么——那么他们需要阅读文档或其他东西。没办法。
【解决方案2】:

我会调用 Create() 并验证我是否获得了具有正确组成类型的正确构造的对象。

【讨论】:

  • 感谢您的回复!如何测试我是否拥有正确的成分类型?我如何知道我使用的是 BlueData 而不是 DarkBlueData?还是 BlueWithWhiteSpotsData?
  • @user - 是否可以根据公开的公共方法的行为来确定正确的组成类型?例如如果使用 BlueData,Create().DoSomething() 会以不同/可验证的方式表现。如果不是,那么我会求助于类似于 C# 中的类型检查的东西 - 将组件转换为预期的类型并断言没有失败。
  • 我在 c++ 中工作,这正是我目前正在测试我的 facotries 的方式: Create().DoSomething() 但我想知道是否有更好的方法或者这是否是标准方法。
  • @user - 我认为行为检查是首选。反汇编对象方法需要访问者进行测试。我更愿意尽可能避免暴露对象内部。我想不出比查询构造对象更简单的方法。我排除了反射,因为语言是 C++
  • 这个问题stackoverflow.com/questions/1061552 似乎是相关的/相同的
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多