谷歌测试C++;-测试夹具 我是C++初学者,我为UNI编写了一条蛇,必须运行单元测试。 仅供参考,我在Xcode 7.1.1上编写代码

谷歌测试C++;-测试夹具 我是C++初学者,我为UNI编写了一条蛇,必须运行单元测试。 仅供参考,我在Xcode 7.1.1上编写代码,c++,unit-testing,googletest,C++,Unit Testing,Googletest,我设法让示例测试在我的机器上运行,但在为我的snake创建夹具时遇到了问题。以下是我的代码: #include "gtest/gtest.h" #include "calc.h" #include "Serpent.h" #include "Map.h" #include "Main.h" using namespace std; using namespace sf; class Serpent_test_fixture: public ::testing::Test {public: Se

我设法让示例测试在我的机器上运行,但在为我的snake创建夹具时遇到了问题。以下是我的代码:

#include "gtest/gtest.h"
#include "calc.h"
#include "Serpent.h"
#include "Map.h"
#include "Main.h"
using namespace std;
using namespace sf;

class Serpent_test_fixture: public ::testing::Test
{public:
Serpent* serpent_test;
Map* map_test;

Serpent_test_fixture(){
    serpent_test = new Serpent(true);
    RenderWindow window(VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT, 32), "SnakeTest", Style::None);
    map_test = new Map("", window, false);
}

virtual void SetUp(){
    map_test->updateGameField(0, 0, HEAD_EAST);
    serpent_test->setHead(*map_test, false);
    int size_init = serpent_test->getSize();
}


virtual void TearDown(){

}

~Serpent_test_fixture(){
    delete serpent_test;
    delete map_test;
}  
};
TEST_F(Serpent_test_fixture, cherry_action)
{
map_test->updateGameField(0,0,CHERRY);
Tiles head_tile_test = HEAD_EAST;
serpent_test->fruit_action(*map_test, head_tile_test);
EXPECT_EQ(20, 20);
}
int main(int argc, char * argv[])
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Undefined symbols for architecture x86_64:
  "Map::updateGameField(int, int, Tiles)", referenced from:
      Serpent_test_fixture_test_cherry_action_Test::TestBody() in main.o
      Serpent_test_fixture::SetUp() in main.o
  "Map::Map(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, sf::RenderWindow const&, bool)", referenced from:
  Serpent_test_fixture::Serpent_test_fixture() in main.o
  "Map::~Map()", referenced from:
  Serpent_test_fixture::SetUp() in main.o
  Serpent_test_fixture::~Serpent_test_fixture() in main.o
  "Serpent::fruit_action(Map&, Tiles&)", referenced from:
  Serpent_test_fixture_test_cherry_action_Test::TestBody() in main.o
  "Serpent::getSize()", referenced from:
  Serpent_test_fixture::SetUp() in main.o
  "Serpent::setHead(Map, bool)", referenced from:
  Serpent_test_fixture::SetUp() in main.o
  "Serpent::Serpent(bool)", referenced from:
  Serpent_test_fixture::Serpent_test_fixture() in main.o
  "Serpent::~Serpent()", referenced from:
  Serpent_test_fixture::~Serpent_test_fixture() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我的理解是,我从我的类蛇创建我的蛇(法语中的蛇),然后从我的类地图创建我的地图

UpdateGameField
更新地图(0,0)中的平铺,并在其上放置“HEAD_EAST”

不管怎样,这是我得到的信息:

#include "gtest/gtest.h"
#include "calc.h"
#include "Serpent.h"
#include "Map.h"
#include "Main.h"
using namespace std;
using namespace sf;

class Serpent_test_fixture: public ::testing::Test
{public:
Serpent* serpent_test;
Map* map_test;

Serpent_test_fixture(){
    serpent_test = new Serpent(true);
    RenderWindow window(VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT, 32), "SnakeTest", Style::None);
    map_test = new Map("", window, false);
}

virtual void SetUp(){
    map_test->updateGameField(0, 0, HEAD_EAST);
    serpent_test->setHead(*map_test, false);
    int size_init = serpent_test->getSize();
}


virtual void TearDown(){

}

~Serpent_test_fixture(){
    delete serpent_test;
    delete map_test;
}  
};
TEST_F(Serpent_test_fixture, cherry_action)
{
map_test->updateGameField(0,0,CHERRY);
Tiles head_tile_test = HEAD_EAST;
serpent_test->fruit_action(*map_test, head_tile_test);
EXPECT_EQ(20, 20);
}
int main(int argc, char * argv[])
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Undefined symbols for architecture x86_64:
  "Map::updateGameField(int, int, Tiles)", referenced from:
      Serpent_test_fixture_test_cherry_action_Test::TestBody() in main.o
      Serpent_test_fixture::SetUp() in main.o
  "Map::Map(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, sf::RenderWindow const&, bool)", referenced from:
  Serpent_test_fixture::Serpent_test_fixture() in main.o
  "Map::~Map()", referenced from:
  Serpent_test_fixture::SetUp() in main.o
  Serpent_test_fixture::~Serpent_test_fixture() in main.o
  "Serpent::fruit_action(Map&, Tiles&)", referenced from:
  Serpent_test_fixture_test_cherry_action_Test::TestBody() in main.o
  "Serpent::getSize()", referenced from:
  Serpent_test_fixture::SetUp() in main.o
  "Serpent::setHead(Map, bool)", referenced from:
  Serpent_test_fixture::SetUp() in main.o
  "Serpent::Serpent(bool)", referenced from:
  Serpent_test_fixture::Serpent_test_fixture() in main.o
  "Serpent::~Serpent()", referenced from:
  Serpent_test_fixture::~Serpent_test_fixture() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
架构x86_64的未定义符号: “Map::updateGameField(int,int,Tiles)”,引用自: main.o中的Serpent\u test\u fixture\u test\u cherry\u action\u test::TestBody() main.o中的Serpent_test_fixture::SetUp() “映射::映射(标准::_1::基本字符串,sf::RenderWindow常量和,bool)”,引用自: Serpent_test_fixture::main.o中的Serpent_test_fixture() “映射::~Map()”,引用自: main.o中的Serpent_test_fixture::SetUp() Serpent_test_fixture::~main.o中的Serpent_test_fixture() “蛇::水果行动(地图和瓷砖和)”,引用自: main.o中的Serpent\u test\u fixture\u test\u cherry\u action\u test::TestBody() “Serpent::getSize()”,引用自: main.o中的Serpent_test_fixture::SetUp() “蛇::设定头(地图,布尔)”,引用自: main.o中的Serpent_test_fixture::SetUp() “蛇::蛇(bool)”,引用自: Serpent_test_fixture::main.o中的Serpent_test_fixture() “蛇::~Serpent()”,引用自: Serpent_test_fixture::~main.o中的Serpent_test_fixture() ld:找不到架构x86_64的符号 叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用)
有人能帮忙吗?这是我第一次使用Google测试,我很难让它工作。

这里的基本问题是如何协调测试项目相对于要测试的产品代码和测试框架的依赖关系。依赖关系驱动构建系统(编译器、链接器等)

<>你可能想看看我的C++!2014年的演示文稿。它使用Boost.Test而不是googletest,但展示了一个基于CMake的方法来协调生产代码和测试代码之间的依赖关系。本研讨会旨在让您在计算机上遵循演示文稿中的步骤,我将提供您在每个步骤中使用的代码

对于典型的测试项目,依赖项如下所示:

  • 测试可执行文件
    • 要测试的生产代码(静态库或共享库)
    • 测试框架

在我的研讨会资料中,我展示了如何使用CMake创建这些依赖项,使用Boost.Test作为测试框架,但原理与google Test相同,配方也几乎相同。

链接器无法在main.o对象文件中找到上述方法的编译代码。你可能有一条蛇和一张地图。您需要告诉链接器也使用这些,而不仅仅是使用main.o中的编译代码。请在您的问题中发布实际的错误消息。图片链接的索引不太好,使那些有类似问题的人很难找到这个问题。谢谢你的评论,我发布了实际的错误消息@亨里克,我该怎么做?不幸的是,我没有使用链接器的经验…@EdouM看到这个:谢谢Henrik,我会查一下:)