簡體   English   中英

使用 fakeit 模擬第 3 方庫

[英]Mocking an 3rd party library using fakeit

我正在編寫我自己的庫/類,它使用了 3rd 方庫。 我想為我自己的類編寫測試,並模擬 3rd 方庫。 在其中一個測試中,我想確保當我的類上的一個函數被調用時,第 3 方庫中的另一個函數也開始被調用。 我認為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 是第 3 方庫的模擬版本。 我的實現實現了真實接口的基本要求,而函數實際上沒有做任何事情。 實現實際上只是為了滿足#include Externlib.h語句。

這是我的 Externlib.cpp:

#include "Externlib.h"

ExternLib:: ExternLib() {}

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

和頭文件:

#pragma once

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

解釋fakeit::SequenceVerificationException :使用Mock<ExternLib> mock; 您創建了一個ExternLib的新實例,它永遠不會被MyTest調用(因為MyTest創建了它自己的ExternLib實例)。 要測試調用,您可以

  • 通過公開或添加訪問器,將存儲在_manager的 ExternLib 實例暴露給您的測試,然后監視它Mock<ExternLib> mock(MyTest._manager);或類似的)
  • 將存儲在MyTest::_manager中的 ExternLib 實例與您的 ExternLib Mock 實例交換。

但這意味着為了可測試而暴露您的受測對象的內部運作,這可能是不希望的。

但是,我以前從未使用過偽造它,當您在將 MyTest 注入后將 mock.get() 傳遞給 MyTest 時,它可能會起作用。

class MyTest {
public:
  MyTest(ExternaLib* lib) : _manager(lib) {}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM