【发布时间】:2010-08-27 15:04:11
【问题描述】:
请考虑以下内容(对于代码量,我很抱歉;但这是我能想到的最小示例......):
class SomeDataThingy
{
};
struct IFileSystemProvider
{
virtual ~IFileSystemProvider() {}
//OS pure virtual methods
}
struct DirectFileSystemProvider
{
//Simply redirects the pure virtuals from IFileSystemProvider to OS functions.
}
struct SomeDataBlock
{
//Stored inside SomeDataThingy; contains specific data
SomeDataBlock(const SomeDataThingy& subject, const IFileSystemProvider& os = DirectFileSystemProvider())
{
//Calculate some data from the Operating System based upon a filename stored in SomeDataThingy.
}
};
struct IFilter
{
virtual ~IFilter() {}
virtual int Matches(const SomeDataThingy&) const = 0;
virtual void Calculate(SomeDataThingy&) const = 0;
};
class SomeFilter : public IFilter
{
int Matches(const SomeDataThingy& subject) const
{
if (!Subject.Contains<SomeDataBlock>())
return UNKNOWN;
else
return /* This filter matches */
}
void Calculate(SomeDataThingy& subject) const
{
std::auto_ptr<SomeDataBlock> data(new SomeDataBlock(subject));
subject.Install<SomeDataBlock>(data);
}
};
我想在这里测试SomeFilter::calculate。问题是 SomeDataBlock 的构造函数调用了文件系统。 SomeDataBlock 本身由模拟IFileSystemProvider 测试。但是,我没有简单的方法将模拟注入SomeFilter::Calculate;不幸的是,我无法更改IFilter 接口以允许将模拟作为参数传递给Calculate,因为还有其他过滤器对于这样的模拟没有任何意义。
如何测试Calculate?
【问题讨论】:
-
你能继承
SomeDataThingy并使用它吗? -
@the-alchemist:
Calculate怎么知道此时要实例化哪个SomeDataThingy?
标签: c++ unit-testing tdd