如何模拟方法返回 istream&?

How to mock method returning istream&?

我模拟了虚拟方法 returning istream&。我想在测试用例中使用它。如何return一些值?

问题是 istream 是不可复制的。

我尝试这样的事情:

TEST(x, y)
{
     MockClass mock;
     std::istringstream str("Some text");

     EXPECT_CALL(mock, m(_)).WillOnce(Return(str)); // m method returns std::istream&

     sut.callMethod();
}

通常我会简单地 return 一个我可以控制的字符串输入流。这样我就可以将预期值推入其中。按照这些思路:

std::istringstream myStream{"This is expected content"};
mocks::MyMockClass mockClass{myStream};

然后在你的方法中:

std::istream& doTheMockedAction(){
    return myStream;
}

编辑: 对于一个模拟框架,我希望你应该能够做这样的事情(记住我没有使用 Google Mocks 所以我完全弥补了这一点)

auto mockOfRealType = MOCK_CLASS<RealType>();
EXPECT_CALL(mockOfRealType, doTheMockedAction()).WillOnce(ReturnRef(myStream))

还有: 您需要将其分配给参考:

std::istream& a = doTheMockedAction();

您应该使用 ReturnRef() 而不是 Return()。参考gmock作弊sheet:

https://github.com/google/googletest/blob/master/docs/gmock_cheat_sheet.md#returning-a-value