【问题标题】:C Unit Testing - Mock (In Check Framework)C 单元测试 - 模拟(在检查框架中)
【发布时间】:2019-09-30 19:32:50
【问题描述】:

我试图在 C 项目的单元测试中“模拟”一些东西。 我正在使用 Check 框架进行测试,并且我有一个从磁盘上的文件中读取内容来验证内容的函数。

我的功能是:

#include "verifier.h"
#include <stdio.h>

int verify_content(char *path, char *verify_string) {
    File *fptr
    fptr = fopen(path, "r")
    // Do verification
    return 0

我的测试是

START_TEST (verify_content_test)
    {
        char *test_path = "test_path";
        char *test_string = "unique_string_content_here";
        ck_assert_str_eq(verify_content(test_path, test_string), 0);
    }
END_TEST

但是,我不希望从磁盘读取它,因为这会很慢,而且我必须拥有多个静态文件来进行测试。

有没有办法“模拟”/“伪造”fopen?

我还是 C 开发的新手,对 C 中的单元测试还是超级新手,所以如果我应该以不同的方式解决这个问题,请指出正确的方向。

【问题讨论】:

    标签: c unit-testing mocking


    【解决方案1】:

    您可以编写自己的fopen() 并将您喜欢的任何内容放入其中。将此模块与需要模拟版本的所有其他模块链接。

    只有在存在未解析的引用时,该函数才会从标准库链接。提供您自己的实现会解析所有引用,因此不会使用标准版本。

    使用 GCC,您还有另一种选择:使用链接器的 --wrap 选项。例如--wrap=fopen会将fopen()的所有引用更改为__wrap_fopen(),并将fopen()的定义符号更改为__real_fopen()。这样您就可以“拦截”来电并根据自己的喜好进行按摩:

    FILE* __wrap_fopen(const char* filename, const char* mode) {
        /* Do anthing you want, including changing arguments or not calling __real_fopen() at all. */
        FILE* result = __real_fopen(filename, mode);
        /* Do anthing you want, including changing the result. */
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-10
      • 2023-04-07
      • 2020-03-19
      • 2011-04-11
      • 2019-09-15
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多