我需要为以下功能编写一些单元测试。为了做到这一点,我需要模拟ifstream对象。我做到了,但我在测试期间控制执行有问题。如何设置get in返回的值
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);
}
答案 0 :(得分:2)
你的方法并不好。 ifstream::get不是虚函数,因此模拟它不会产生预期影响:调用base 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());
};
然后模拟:
{{1}}
拥有这些课程 - 只需更改您的实施和测试 - 它就能发挥作用。