Il existe trois façons de simuler les dépendances externes en C++ : 1. Stubbing (comportement prédéfini), 2. Stubbing (enregistrement des appels), 3. Injection (passage des simulations comme arguments). Grâce au stubbing, au stubbing et à l'injection, vous pouvez isoler les composants et créer des tests unitaires robustes.
Comment se moquer des dépendances externes dans les tests unitaires C++
Dans les tests unitaires, se moquer des dépendances externes est très important pour isoler les tests de composants individuels. Voici trois façons de simuler facilement des dépendances externes en C++ :
1 Stub
Un stub est une simulation qui fournit un comportement prédéfini sans appeler la dépendance réelle. Pour créer des stubs, vous pouvez utiliser un framework moqueur tel que Google Mock ou CMocka.
// 使用 Google Mock 创建一个桩: class MockExternalDependency { public: MOCK_METHOD(int, Function1, (int a, int b)); }; // 创建桩并用它替换实际的依赖项: MockExternalDependency mockDependency; EXPECT_CALL(mockDependency, Function1(1, 2)).WillOnce(Return(3)); // 测试代码: int result = TestFunction(&mockDependency); ASSERT_EQ(result, 3);
2. Stub
Un stub est similaire à un stub, mais il n'a pas de comportement prédéfini. Au lieu de cela, il enregistre les appels aux dépendances et vous permet de les inspecter. Ceci est utile pour vérifier l’entrée et l’ordre des appels.
// 使用 CMocka 创建一个存根: void external_dependency_stub(int a, int b) { // 记录被调用的参数 } // 设置存根并测试代码: cmocka_set_stub(external_dependency, external_dependency_stub); TestFunction(); // 检查存根中记录的调用: ASSERT_TRUE(cmocka_call_count(external_dependency) > 0);
3. Injection
L'injection consiste à transmettre des dépendances en tant que paramètres à la fonction testée. Cela vous permet de remplacer facilement l'implémentation d'une dépendance pour utiliser des simulations pendant les tests.
// 使用依赖项注入进行测试: void TestFunction(ExternalDependency& dependency) { // 使用模拟依赖项调用函数: MockExternalDependency mockDependency; EXPECT_CALL(mockDependency, Function1(1, 2)).WillOnce(Return(3)); int result = TestFunction(&mockDependency); ASSERT_EQ(result, 3); }
Cas pratique :
Supposons que nous ayons une fonction ReadFile
,它依赖于外部类 FileSystem
中的 OpenFile
和 ReadFile
方法。为了对 ReadFile
进行单元测试,我们需要模拟 FileSystem
:
class MockFileSystem { public: MOCK_METHOD(FILE*, OpenFile, (const char* filepath)); MOCK_METHOD(int, ReadFile, (FILE* file, char* buffer, int size)); }; void TestReadFile() { MockFileSystem mockFileSystem; FILE* mockFile = fopen("mockfile.txt", "w"); EXPECT_CALL(mockFileSystem, OpenFile("mockfile.txt")).WillOnce(Return(mockFile)); EXPECT_CALL(mockFileSystem, ReadFile(mockFile, testing::_, _)) .WillOnce(SetArrayArgument<1>("Hello", 5)); char buffer[10]; int result = ReadFile("mockfile.txt", buffer, 10, &mockFileSystem); ASSERT_EQ(result, 5); ASSERT_STREQ(buffer, "Hello"); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!