2011-02-08 75 views
1

我单元测试我的课程,给我所有的课程一个界面。这些接口反过来也是他们自己的嘲弄。如何对工厂进行单元测试?

但可以说我有以下几点:

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; 
    } 
} 

感谢您的帮助,

巴里。

+1

哪来的C++代码? ;) – murrekatt 2011-02-11 06:29:46

回答

3

我不知道该代码段是真正的C++,但例子应该是这样的:

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

class Example1 
{ 
    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 
} 
3

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

+0

感谢您的回复!我如何测试我拥有正确的组分类型?我如何知道我是否使用BlueData而不是DarkBlueData?还是BlueWithWhiteSpotsData? – Baz 2011-02-08 10:02:25

+1

@user - 是否可以根据暴露的公共方法的行为来确定正确的组成类型?例如Create()。如果使用BlueData,则DoSomething()以独特/可验证的方式运行。如果不是,那么我会采取类似于C#中类型检查的方式 - 将组件转换为预期的类型,并声明没有失败。 – Gishu 2011-02-08 10:06:21