C ++ unitTest с заменой LinkTime - PullRequest
       26

C ++ unitTest с заменой LinkTime

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

Я читаю «Разработка через тестирование для Embedded C» Джеймса У. Греннинга.

Я бы хотел воспроизвести случай с «Подстановкой времени ссылки» с использованием Visual Studio Community 2019 и gTest.

У меня есть следующий код:

production_code статически связанная библиотека

foo.cpp

#include "foo.h"

int foo(int x) {
    return x + 1;
}

foo.h

#ifndef _foo_
#define _foo_

int foo(int x);

#endif //_foo_

В проекте gtest библиотека production_code включена по ссылке test.cpp

#include "gtest\gtest.h"
#include "gmock\gmock.h"

#include "..\prod\foo.h"

//fake implementation of production code foo
int foo(int x) {
    return x - 1;
}
TEST(TestCaseName, TestName) {
  auto x = foo(5);
  EXPECT_EQ(x, 4);
}

Компоновщик выдает мне следующую ошибку:

1> prod.lib (foo.obj): ошибка LNK2005: «int __cdecl foo (int)» (? Foo @@ YAHH @ Z) уже определено в test.obj 1> C: \Пример \ prod_test.exe: фатальная ошибка LNK1169: найден один или несколько кратно определенных символов

Что я здесь пропустил? Почему это не работает?

Если я добавлю команду "/ FORCE: MULTIPLE" к компоновщику, то получу только предупреждение, но думаю, что это неправильный подход к этому.

1 Ответ

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

Эта ситуация возникает из-за того, что вы определили foo(int) в 2 местах: foo.cpp и test.cpp , и вы строите свой код с помощью этих файлов. Если вам нужно запустить какой-нибудь тест с заглушкой (в данном случае с поддельной функцией foo(int)), вам нужно создать 2 цели сборки для:

  1. построения вашего реального приложения
  2. создание специального приложения для модульного тестирования (и чем его запускать)

А когда вы создаете приложение для модульного тестирования, вы связываете его с test.cpp (но не с foo.cpp ). Кроме того, когда вы создаете свое реальное приложение, вы связываете его с foo.cpp (но не с test.cpp ).

Примечание : этоимеет смысл протестировать реальный код и создать заглушку, когда эта заглушка предоставляет некоторые дополнительные функции в соответствии с идеей теста (например, вы проверяете свою функцию sort(), но вы можете использовать заглушку для генерации данных для sort(), потому что данныепредоставляется после того, как какой-то сложный алгоритм закончил работу и вычисления занимают много времени) или вы не хотите использовать некоторые ресурсы (например, вы проверяете свою функцию sort(), но вы используете сетевое соединение с сервером для получения реальных данныхдля sort()) или вам нужно предоставить некоторые конкретные данные для тестирования вашего алгоритма (например, чтобы проверить угловой случай с использованием определенных данных, или, возможно, вы обнаружили, что sort() не работает сконкретные данные). Но опять же, имеет смысл протестировать реальный код.

...