我正在写我自己的图书馆/班级,利用第三方图书馆。我想为我自己的班级编写测试,并嘲笑第三方库。在其中一个测试中,我希望确保在调用类上的函数时,第三方库中的另一个函数也会被调用。我认为FakeIt库是测试这个的好主意。
这是我的测试代码示例:
#include "MyTest.h"
#include "fakeit.hpp"
using namespace fakeit;
int main() {
MyTest dt;
Mock<ExternLib> mock;
Fake(Method(mock, someFunc));
ExternLib& el = mock.get();
dt.begin();
Verify(Method(mock, someFunc));
return 0;
}
但是,当它运行时,它将抛出一个fakeit::SequenceVerificationException
Expected pattern: mock.someFunc( Any arguments )
Expected matches: at least 1
Actual matches : 0
Actual sequence : total of 0 actual invocations.
所以很明显,模拟没有工作,它的方法也没有被调用。知道我如何模拟这个类并验证它的方法是否被调用了吗?
MyTest.cpp只是一个简单的测试,它将成为我的完整库/类:
#include "MyTest.h"
MyTest::MyTest() {
_manager = new ExternLib();
}
void MyTest::begin() {
result = _manager->someFunc();
}
它是头文件:
#pragma once
#include "Externlib.h"
class MyTest {
public:
MyTest();
virtual void begin();
int result = 3;
private:
ExternLib *_manager;
};
ExternLib是第三方库的模拟版本。我的实现实现了实际接口的基本需求,而这些函数实际上什么也不做。实际上,实现只是为了满足#include Externlib.h
语句。
这是我的Externlib.cpp:
#include "Externlib.h"
ExternLib:: ExternLib() {}
int ExternLib::someFunc() {
return 5;
}
以及头文件:
#pragma once
class ExternLib {
public:
ExternLib();
virtual int someFunc();
};
发布于 2021-01-02 11:05:58
要解释fakeit::SequenceVerificationException
:使用行Mock<ExternLib> mock;
创建一个新的ExternLib
实例,它不会被MyTest
调用(因为MyTest
创建了它自己的ExternLib
实例)。要测试调用,您可以
_manager
中的_manager
实例公开或添加访问器,然后将监视它 (Mock<ExternLib> mock(MyTest._manager);
或类似的)公开以供测试。MyTest::_manager
中的ExternLib实例。但是这意味着为了测试的可测试性而将你的被试暴露在测试的内部工作中,这可能是不想要的。
发布于 2021-01-05 22:55:04
但是,我以前从未使用过假的,但是,当您将mock.get()传递给MyTest时,在您使MyTest可注入时,它可能会起作用。
class MyTest {
public:
MyTest(ExternaLib* lib) : _manager(lib) {}
}
https://stackoverflow.com/questions/59819536
复制相似问题