使用TDD时隐藏文件访问实现详细信息

Hide file access implementation details while using TDD

本文关键字:实现 详细信息 访问 隐藏文件 TDD 使用      更新时间:2023-10-16

我正在尝试创建一个从tablefileinterface继承的csvtablefile类。为了单位测试类,我想模拟所有文件访问。

这是一个问题:为了能够模拟文件访问,我必须介绍WinapiInterface(或您想称呼的任何内容,例如FileioInterface(,必须将其提供给CSVTableFile类的构造函数。但是,这显示了所有人的实现,该实现被授予OpenFile。如果我想将内部设备从OpenFile更改为Ifstream,我必须更改构造函数,因为我不需要WinapiInterface即可传递到类,而是FileStreamInterface。

我对这种情况并不特别满意,但我无法提出解决方案。我想念什么吗?

class WinApiInterface {
public:
    virtual HFILE WINAPI OpenFile(
       _In_  LPCSTR     lpFileName,
       _Out_ LPOFSTRUCT lpReOpenBuff,
       _In_  UINT       uStyle ) = 0;
}
class WinApi : public WinApiInterface {
public:
    virtual HFILE WINAPI OpenFile(
       _In_  LPCSTR     lpFileName,
       _Out_ LPOFSTRUCT lpReOpenBuff,
       _In_  UINT       uStyle ) { 
           return ::OpenFile(lpFileName, lpReOpenBuff, lpReOpenBuff);};
}

class TableFileInterface {
public:
    virtual int Open(std::string file) = 0;
    virtual int Close() = 0;
    virtual std::string GetCellAsString(size_t row; size_t column) = 0;
    virtual double GetCellAsDouble(size_t row; size_t column) = 0;
}
class CsvTableFile : public TableFileInterface {
public:
    CsvTableFile(const WinApiInterface& win_api)
       : win_api_(win_api){};
    ~CsvTableFile(){};
    virtual int Open(std::string file) { *CODE USING win_api_.OpenFile(...)*};
    virtual int Close() {...};
    std::string GetCellAsString(size_t row; size_t column) {...};
    double GetCellAsDouble(size_t row; size_t column) {...};
protected:
    WinApiInterface win_api_;
}

如果您的主要目标是防止CsvTableFile需要更改,则可以模板并将开放逻辑转移到模板参数对象。

template <class T>
class CsvTableFile : public TableFileInterface {
public:
    CsvTableFile(const T& _fileopener):fileopener(_fileopener){}
    int Open(std::string file) { fileopener.OpenFile(...); }
    T& fileopener;
    ...
};

然后,为要在每个类中使用并实现OpenFile方法的每种类型的文件处理创建一个类。