Модульное тестирование C - Mock (In Check Framework) - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь «высмеять» некоторые вещи в моем модульном тестировании 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, поэтому, если я должен подойти к этой проблеме по-другому, пожалуйста, укажите мне правильное направление.

1 Ответ

0 голосов
/ 01 октября 2019

Вы можете написать свой собственный 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;
}
...