Google Mock:模拟fstream对象和测试中的执行控制
Google Mock: mock fstream object and control of execution in test
我需要为以下功能编写一些单元测试。为此,我需要模拟 ifstream 对象。我这样做了,但是我在测试期间对执行的控制有问题。如何设置 get in 返回的值
while(p_fileDescriptor->get(l_singleByte))
在一种情况下是 eofbit 对象,在另一种情况下是 "normal" 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);
}
你的方法不好。 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);
}
或者,更好 - 你应该创建自己的抽象 - 定义你的接口,这是 returns 单字节的东西:
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());
};
有了这些 类 - 只需更改您的实施和测试 - 它就会起作用。
我需要为以下功能编写一些单元测试。为此,我需要模拟 ifstream 对象。我这样做了,但是我在测试期间对执行的控制有问题。如何设置 get in 返回的值
while(p_fileDescriptor->get(l_singleByte))
在一种情况下是 eofbit 对象,在另一种情况下是 "normal" 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);
}
你的方法不好。 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);
}
或者,更好 - 你应该创建自己的抽象 - 定义你的接口,这是 returns 单字节的东西:
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());
};
有了这些 类 - 只需更改您的实施和测试 - 它就会起作用。