【问题标题】:Google Mock: mock fstream object and control of execution in testGoogle Mock:在测试中模拟 fstream 对象和执行控制
【发布时间】:2016-03-20 20:59:48
【问题描述】:

我需要为以下功能编写一些单元测试。为此,我需要模拟 ifstream 对象。我这样做了,但是我在测试期间控制执行时遇到了问题。如何设置获取返回的值 while(p_fileDescriptor->get(l_singleByte)) 在一种情况下是 eofbit 对象,在另一种情况下是“正常” istream 对象?我尝试了一些选项,但它不起作用。你能帮我解决这个问题吗? 波纹管功能是我的单元测试。 测试功能:

void ServerSendFileRequestHandler::sendRequestedFile(std::shared_ptr<std::istream> p_fileDescriptor, int& p_clientSocket) const
{
unsigned int l_msgCounter = 1;
unsigned long long l_byteCounter = 0;
Message l_sendline;
memset(&l_sendline, 0, sizeof(l_sendline));

char l_singleByte;
while(p_fileDescriptor->get(l_singleByte))
{
    checkIfReadByteSucceded(p_fileDescriptor, l_byteCounter);
    l_sendline.payload[l_byteCounter] = l_singleByte;
    l_byteCounter++;

    if(l_byteCounter == PAYLOAD_SIZE)
    {
        std::cout << "Sending message number: " << l_msgCounter << std::endl;
        sendClientSendFileInd(l_sendline, l_byteCounter, p_clientSocket);
        l_msgCounter++;

        l_byteCounter = 0;
        memset(&l_sendline, 0, sizeof(l_sendline));
    }
}

if(l_byteCounter)
{
    std::cout << "Sending message number: " << l_msgCounter << std::endl;
    sendClientSendFileInd(l_sendline, l_byteCounter, p_clientSocket);
    l_msgCounter++;
}
std::cout << "Sending of file is done!" << std::endl;
}

我的单元测试:

#include "gmock/gmock.h"
#include <istream>
using namespace std;
class FstreamMock : public std::istream  
{
public:
    MOCK_METHOD1(get, istream&(char&));
};

using namespace testing;
TEST_F(ServerSendFileRequestHandlerTestSuite, sendRequestedFileTest)
{
    int l_clientSocket = 0;
    std::shared_ptr<FstreamMock> l_fileDescriptor;
    const bool i = false;

    char l_byte;
    //EXPECT_CALL(*l_fileDescriptor, get(_)).WillRepeatedly(ReturnRef(*l_fileDescriptor));
    EXPECT_CALL(*l_fileDescriptor, get(_)).WillRepeatedly(ReturnRef(*l_fileDescriptor);
    m_sut.sendRequestedFile(l_fileDescriptor, l_clientSocket);
}

【问题讨论】:

    标签: c++ unit-testing fstream googletest googlemock


    【解决方案1】:

    你的方法不好。 ifstream::get 不是虚函数,所以模拟它并没有你期望的效果:base ifstream::get 被调用。

    无论如何 - 你应该使用istream 而不是ifstream - 在函数ServerSendFileRequestHandler::sendRequestedFile - 并且为了测试你可以使用stringstream - 很容易断言写入stringstream的内容。您可以将此函数名称更改为ServerSendFileRequestHandler::sendRequestedStream

    TEST_F(ServerSendFileRequestHandlerTestSuite, sendRequestedStreamTest)
    {
        std::istringstream stream("some input");
        int l_clientSocket = 0;
        const bool i = false;
    
        char l_byte;
        m_sut.sendRequestedStream(stream, l_clientSocket);
    }
    

    或者,更好 - 你应该创建自己的抽象 - 定义你的接口,这是返回单字节的东西:

    class IByteStream  
    {
    public:
        virtual ~IByteStream() = default;
        virtual char get() = 0;
    };
    

    那么——基于std::istream的实现:

    class StdStreamByteStream : public IByteStream  
    {
    public:
        StdStreamByteStream(std::istream& is) : is(is) {}        
        char get() override { return is.get(); }
    private:
        std::istream& is;
    };
    

    然后模拟:

    class ByteStreamMock : public IByteStream  
    {
    public:
        MOCK_METHOD0(get, char());
    };
    

    拥有这些类 - 只需更改您的实现和测试 - 它就会起作用。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2014-02-15
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      相关资源
      最近更新 更多