gpt4 book ai didi

使用 Link inTime 替换的 C++ 单元测试

转载 作者:行者123 更新时间:2023-12-02 10:38:22 24 4
gpt4 key购买 nike

我正在阅读 James W. Grenning 的“嵌入式 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 库通过引用包含在内
测试.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) : error LNK2005: "int __cdecl foo(int)" (?foo@@YAHH@Z) already defined in test.obj 1>C:\Example\prod_test.exe : fatal error LNK1169: one or more multiply defined symbols found



我在这里错过了什么?为什么这不起作用?

如果我将命令“/FORCE:MULTIPLE”添加到链接器,那么我只会收到警告,但我认为这不是正确的做法。

最佳答案

出现这种情况是因为您定义了 foo(int)在 2 个地方: foo.cpp 测试.cpp 然后你用这个文件构建你的代码。如果您需要使用 stub 运行一些测试(假函数 foo(int) 在这种情况下)您需要创建 2 个构建目标:

  • 构建您的真实应用程序
  • 为单元测试构建一个特殊的应用程序(然后运行它)

  • 当您为单元测试构建应用程序时,您将其链接到 测试.cpp (但不是 foo.cpp )。此外,当您构建您的真实应用程序时,您可以将其与 链接。 foo.cpp (但不适用于 test.cpp )。

    备注 :当这个 stub 根据测试的想法提供一些额外的功能时,测试真实代码并创建一个 stub 是有意义的(例如,您检查您的 sort() 函数,但您可以使用 stub 为 sort() 生成数据,因为数据是在一些复杂的算法完成工作并且计算需要很多时间后提供的)或者您不想使用某些资源(例如,您检查了 sort() 函数但您使用与服务器的网络连接来获取 sort() 的真实数据)或者您需要提供一些特定数据来测试您的算法(例如,使用特定数据检查 corner case;或者您可能发现 sort() 不适用于特定数据) .但同样,测试真实代码是有意义的。

    关于使用 Link inTime 替换的 C++ 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58484081/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com