gpt4 book ai didi

c++ - gmock ElementsAreArray() Matcher 在 gmock-matchers.h 中给出编译器错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:16 25 4
gpt4 key购买 nike

我正在进行一些测试,以便重构一个旧的 C++ 项目。我正在尝试使用 gmock 匹配器 ElementsAreArray() 来匹配两个数组。

EXPECT_THAT(value_instance.value, ::testing::ElementsAreArray(var_array));

其中 value_instance.value 是指向 C 数组的指针。

但是,当我在测试中使用这行代码进行编译时,我从 gmock-matchers.h 文件中得到以下错误输出:

Error   1   error C2510: 'type' : left of '::' must be a class/struct/union s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2535    1   Project_Tests
Error 2 error C2146: syntax error : missing ';' before identifier 'Element' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2536 1 Project_Tests
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2536 1 Project_Tests
Error 4 error C2065: 'Element' : undeclared identifier s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2536 1 Project_Tests
Error 5 error C2825: 'testing::internal::ElementsAreMatcherImpl<Container>::StlContainer': must be a class or namespace when followed by '::' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2399 1 Project_Tests
Error 6 error C2039: 'value_type' : is not a member of '`global namespace'' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2399 1 Project_Tests
Error 7 error C2146: syntax error : missing ';' before identifier 'Element' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2399 1 Project_Tests
Error 8 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2399 1 Project_Tests
Error 9 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2502 1 Project_Tests
Error 10 error C2146: syntax error : missing ',' before identifier 'Element' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2502 1 Project_Tests
Error 11 error C2065: 'Element' : undeclared identifier s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2502 1 Project_Tests
Error 12 error C2059: syntax error : '>' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2502 1 Project_Tests
Error 13 error C2143: syntax error : missing ';' before '}' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2506 1 Project_Tests
Error 14 error C1004: unexpected end-of-file found s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2506 1 Project_Tests

我可能遗漏了一些非常愚蠢的东西,但我似乎找不到问题所在。

#include <cstring>    
#include "gtest/gtest.h"
#include "gmock/gmock.h"

//This is a stripped down version of The Class under test

enum {
VAL_TYPE_UNKNOWN, VAL_TYPE_INT, VAL_TYPE_BOOL, VAL_TYPE_ARRAY
};

class ClassUnderTest
{
public:

int alloc_len;
int len;
int type;
long i_value;
unsigned char *value;

ClassUnderTest (void)
{
alloc_len = 0;
len = 0;
value = 0;
i_value = 0;
type = VAL_TYPE_INT;
}

~ClassUnderTest (void)
{
if (value)
{
delete [] value;
value = 0;
}
}

void Init (void *val, int v_len)
{
NewLength(v_len);
if (val)
memcpy(value, val, v_len);
type = VAL_TYPE_ARRAY;
}

void NewLength (int new_len)
{
unsigned char *old;

if ((new_len > alloc_len) || (new_len == 0))
{
old = value;
value = 0;
if (new_len > 0)
{
value = new unsigned char [new_len];
memset(value, 0, new_len);
}
alloc_len = new_len;
if (old)
{
if (value)
memcpy(value, old, len);
delete [] old;
}
}
else if (new_len > len)
memset(value+len, 0, new_len-len);
len = new_len;
}
}

//this fails with the error list above

TEST(ClassUnderTestTests, TestInit)
{
ClassUnderTest value_instance;
unsigned char var_array[] = {1, 2, 3, 4, 5};
value_instance.Init((void *)var_array, sizeof(var_array));
EXPECT_EQ(value_instance.len, sizeof(var_array));
EXPECT_EQ(value_instance.i_value, 0);
EXPECT_EQ(value_instance.type, VAL_TYPE_ARRAY);
EXPECT_THAT(value_instance.value, testing::ElementsAreArray(var_array));
}



//This example works However the code above does not

TEST(ClassUnderTestTests, ElementsAreArrayFailure)
{
int array1[] = {1, 2, 3, 4, 5};
int array2[] = {1, 2, 3, 4, 5};
EXPECT_THAT(array1, testing::ElementsAreArray(array2));
}

int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

最佳答案

您需要取消引用指向 C 数组的指针。

EXPECT_THAT(*value_instance.value, ::testing::ElementsAreArray(var_array));
// ^--- dereference the C-array

更新:

好的,现在看过你的代码,我会说 value_instance.value 是一个动态分配的数组而不是指向 C 数组的指针(参见 Arrays and Pointers 上的 comp.lang.c FAQ ).

所以简单的解决方法是交换 EXPECT_THAT(value, matcher) 宏中的参数。在这种情况下,该值不能只是一个指针,您需要给它一个类似于 std:: 的容器(例如 C 数组)。但是,ElementsAreArray 函数可以处理被传递的动态分配数组,假设您还向它传递了数组的大小(因为无法推断)。

EXPECT_THAT(var_array,
testing::ElementsAreArray(value_instance.value, value_instance.len));

与其将参数的顺序交换到 EXPECT_THAT,您还可以从 value_instance.value 构造一个临时的 vector 并将其作为值:

std::vector<unsigned char> value_copy(value_instance.value,
value_instance.value + value_instance.len);
EXPECT_THAT(value_copy, testing::ElementsAreArray(var_array));

关于c++ - gmock ElementsAreArray() Matcher 在 gmock-matchers.h 中给出编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16467037/

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