gpt4 book ai didi

unit-testing - 指向基类的 gmock 指针没有成员 gmock_

转载 作者:行者123 更新时间:2023-12-01 11:20:41 32 4
gpt4 key购买 nike

对不起,如果标题不清楚。

我有一个虚拟基类:

class FileSystemInterface {
public:
virtual ~FileSystemInterface() {};

virtual void save(std::string file_content) = 0;
};

我的模拟类源自于此:
class MockFile : public FileSystemInterface
{
public:
MOCK_METHOD1(save, void(std::string));
};

现在我有一个我正在测试的方法,它采用指向 FileSystemInterface 的唯一指针。 :
void my_method(std::unique_ptr<FileSystemInterface>& interface)

我的测试代码如下:
std::unique_ptr<FileSystemInterface> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);

问题是 EXPECT_CALL给我一个错误 class "FileSystemInterface" has no member "gmock_save"
大概是因为我的模拟是指向基类的指针,但是如果我按如下方式更改我的测试:
std::unique_ptr<MockFile> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);

然后 EXPECT_CALL很好,但现在 my_method投诉: a reference of type "std::unique_ptr<FileSystemInterface, std::default_delete<FileSystemInterface>> &" (not const-qualified) cannot be initialized with a value of type "std::unique_ptr<MockFile, std::default_delete<MockFile>>"
我怎样才能解决这个冲突并创建我的测试?谢谢你。

更新

正如 Alexey Guseynov 的回答中指出的那样,我的方法确实拥有指针的所有权,所以要做的就是将我的方法更改为
void my_method(std::unique_ptr<FileSystemInterface> interface);

并像这样运行我的测试:
std::unique_ptr<MockFile> mockFile(new MockFile);
EXPECT_CALL(*mockFile, save(_));
my_method(std::move(mockFile));

最佳答案

您必须将模拟存储为 MockFile,如下所示:

std::unique_ptr<MockFile> mockFile(new MockFile);  // not so obvious change
EXPECT_CALL(*mockFile, save(_));
my_method(mockFile);
但是您需要更改方法的签名。引用 unique_ptr 很奇怪,因为不清楚谁拥有该对象。如果 my_method 拥有 mockFile,则通过将指针移入方法(按值传递)来转移所有权。如果 my_method 不拥有该文件,则将其作为普通指针传递。

关于unit-testing - 指向基类的 gmock 指针没有成员 gmock_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028922/

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