gpt4 book ai didi

c++ - 对在 C++ 中测试接口(interface)实现方法感到困惑。我该如何测试它?

转载 作者:行者123 更新时间:2023-11-30 01:31:07 25 4
gpt4 key购买 nike

请考虑以下内容(对于代码量我很抱歉;但这是我能想到的最小示例...):

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 测试。但是,我没有将模拟注入(inject) SomeFilter::Calculate 的简单方法;不幸的是,我无法更改 IFilter 接口(interface)以允许将 mock 作为参数传递给 Calculate,因为对于其他过滤器,这样的 mock 没有任何意义.

如何测试计算

最佳答案

可以修改SomeFilter的构造函数吗?如果是这样,您可以通过这种方式注入(inject) IFileSystemProvider。

class SomeFilter : public IFilter
{
public:
SomeFilter(const IFileSystemProvider& fs = DirectFileSystemProvider())
: fs(fs)
{
}

private:
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, fs));
subject.Install<SomeDataBlock>(data);
}

IFileSystemProvider fs;
};

您还可以在 SomeFilter 上创建一个公共(public)成员,以允许用户在调用 Calculate 之前但在构造对象之后提供 IFileSystemProvider。

关于c++ - 对在 C++ 中测试接口(interface)实现方法感到困惑。我该如何测试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3585486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com