首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用fakeit模拟第三方库

使用fakeit模拟第三方库
EN

Stack Overflow用户
提问于 2020-01-20 08:38:56
回答 2查看 1.2K关注 0票数 1

我正在写我自己的图书馆/班级,利用第三方图书馆。我想为我自己的班级编写测试,并嘲笑第三方库。在其中一个测试中,我希望确保在调用类上的函数时,第三方库中的另一个函数也会被调用。我认为FakeIt库是测试这个的好主意。

这是我的测试代码示例:

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
Expected pattern: mock.someFunc( Any arguments )
Expected matches: at least 1
Actual matches  : 0
Actual sequence : total of 0 actual invocations.

所以很明显,模拟没有工作,它的方法也没有被调用。知道我如何模拟这个类并验证它的方法是否被调用了吗?

MyTest.cpp只是一个简单的测试,它将成为我的完整库/类:

代码语言:javascript
运行
复制
#include "MyTest.h"

MyTest::MyTest() {
    _manager = new ExternLib();
}

void MyTest::begin() {
    result = _manager->someFunc();
}

它是头文件:

代码语言:javascript
运行
复制
#pragma once
#include "Externlib.h"

class MyTest {
    public:
        MyTest();
        virtual void begin();
        int result = 3;
    private:
        ExternLib *_manager;
};

ExternLib是第三方库的模拟版本。我的实现实现了实际接口的基本需求,而这些函数实际上什么也不做。实际上,实现只是为了满足#include Externlib.h语句。

这是我的Externlib.cpp:

代码语言:javascript
运行
复制
#include "Externlib.h"

ExternLib:: ExternLib() {}

int ExternLib::someFunc() {
    return 5;
}

以及头文件:

代码语言:javascript
运行
复制
#pragma once

class ExternLib {
    public:
        ExternLib();
        virtual int someFunc();
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-02 11:05:58

要解释fakeit::SequenceVerificationException:使用行Mock<ExternLib> mock;创建一个新的ExternLib实例,它不会被MyTest调用(因为MyTest创建了它自己的ExternLib实例)。要测试调用,您可以

  • 将存储在_manager中的_manager实例公开或添加访问器,然后将监视它 (Mock<ExternLib> mock(MyTest._manager);或类似的)公开以供测试。
  • 用ExternLib模拟实例交换存储在MyTest::_manager中的ExternLib实例。

但是这意味着为了测试的可测试性而将你的被试暴露在测试的内部工作中,这可能是不想要的。

票数 1
EN

Stack Overflow用户

发布于 2021-01-05 22:55:04

但是,我以前从未使用过假的,但是,当您将mock.get()传递给MyTest时,在您使MyTest可注入时,它可能会起作用。

代码语言:javascript
运行
复制
class MyTest {
public:
  MyTest(ExternaLib* lib) : _manager(lib) {}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59819536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档