gpt4 book ai didi

c++ - Hippo Mocks 中具有不同返回值的多个预期调用是否可以重复使用模拟?

转载 作者:行者123 更新时间:2023-11-30 04:20:32 25 4
gpt4 key购买 nike

我使用 Hippo Mocks 取得了巨大的成功,但我有一种情况,我不太清楚如何正确设置。被测代码看起来像这样:

auto firstName = record.at("firstName").getValue();
auto lastName = record.at("lastName").getValue();

其中 IRecord::at() 返回一个 IColumn&,它有一个纯虚拟的 getValue() 方法。我正在尝试使用 IrecordIColumn 的模拟版本测试我的代码:

auto mockRec = mocks.InterfaceMock<IRecord>();
auto mockCol = mocks.InterfaceMock<IColumn>();

我可以为 firstName 设置期望:

mocks.OnCall(mockRec, IRecord::at).With("firstName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).Return(std::string("John")));

但我想为 lastName 的下一个期望重用 IColumn 模拟。

mocks.OnCall(mockRec, IRecord::at).With("lastName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).Return(std::string("Doe")));

但是当我运行它时,Hippo Mocks 为两个 getValue() 调用返回“John”。

跟随 tutorial ,我试图限制“firstName”和“lastName”调用的顺序:

auto& firstCall = mocks.OnCall(mockRec, IRecord::at).With("firstName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).After(firstCall).Return(std::string("John")));

auto& lastCall = mocks.OnCall(mockRec, IRecord::at).With("lastName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).After(lastCall).Return(std::string("Doe")));

但是对于 getValue() 调用我仍然得到“John”。

问: 是否可以重用 IColumn 接口(interface)并告诉 Hippo Mocks 在每次 getValue() 调用时返回不同的值,就像我一样需要,还是我坚持为每个参数创建一个单独的 IColumn 模拟?注意:我的实际实现将有两个以上的参数,因此重用 IColumn 模拟减少了每个单元测试的大量设置。

最佳答案

我不确定您遇到的问题是什么,但是当我使用 version form the git repoitory 运行以下代码时

struct IColumn {
virtual std::string getValue() = 0;
};

struct IRecord {
virtual IColumn& at( std::string ) = 0;
};

void main()
{
MockRepository mocks;

auto mockRec = mocks.Mock<IRecord>();
auto mockCol = mocks.Mock<IColumn>();

auto& firstCall = mocks.OnCall(mockRec, IRecord::at).With("firstName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).After(firstCall).Return(std::string("John"));

auto& lastCall = mocks.OnCall(mockRec, IRecord::at).With("lastName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).After(lastCall).Return(std::string("Doe"));

std::cout << mockRec->at("firstName").getValue() << " "
<< mockRec->at("lastName").getValue() << "\n";
}

我得到了正确的输出。

John Doe

我发现我几乎总是使用

mocks.autoExpect = false;

但在这种情况下它没有任何区别。

编辑:

如果您需要更大的灵 active ,您可以这样做:

std::vector<IColumn*> cols;

cols.push_back( mocks.Mock<IColumn>() );
cols.push_back( mocks.Mock<IColumn>() );

mocks.OnCall(mockRec, IRecord::at).With("firstName")
.Return(std::ref(*cols[0]));
mocks.OnCall(mockRec, IRecord::at).With("lastName")
.Return(std::ref(*cols[1]));

mocks.OnCall(cols[0], IColumn::getValue)
.Return(std::string("John"));
mocks.OnCall(cols[1], IColumn::getValue)
.Return(std::string("Doe"));

这将以任何调用顺序工作。或者,您也可以使用 Do

std::map<std::string, IColumn*> map;

map["firstName"] = mocks.Mock<IColumn>();
map["lastName"] = mocks.Mock<IColumn>();

mocks.OnCall(mockRec, IRecord::at)
.Do( [&map]( std::string& key){ return std::ref(*map[key]); } );

mocks.OnCall(map["firstName"], IColumn::getValue)
.Return(std::string("John"));
mocks.OnCall(map["lastName"], IColumn::getValue)
.Return(std::string("Doe"));

关于c++ - Hippo Mocks 中具有不同返回值的多个预期调用是否可以重复使用模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15230050/

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