我正在做一个测试。我想测试的函数有两个参数。
int functionA(const ObjectA& obja, const stl::vector<ObjectB>& objb)
在我的测试中,我想模拟一些测试用例。
对于obja
,我所做的是:
ObjectA* obja = new ObjectA();
obja->type() = someValue; //setter function
obja->value() = someValue; // setter too
然后将*(const_cast<ObjectA*>(obja))
作为参数传递。
但是对于向量,我不确定const
定义了什么。我试过了:
stl::vector<ObjectB*>* input;
ObjectB objb = new ObjectB();
objb->type() = someValue // setter
objb->id() = someValue//setter
input.push_back(objb);
然后将*(const_cast<ObjectB*>(input))
作为参数传递。
但是我收到一条错误消息,说"没有匹配功能"。
谁能告诉我如何模拟input
并通过测试?
为了方便起见,gtest 中的代码是(假设类名为 A):
ObjectA* obja = new ObjectA();
obja->type() = someValue; //setter function
obja->value() = someValue; // setter too
stl::vector<ObjectB*>* input;
ObjectB objb = new ObjectB();
objb->type() = someValue // setter
objb->id() = someValue//setter
input.push_back(objb);
A* instanceA = A::getInstance();
EXPECT_EQ(-2, instanceA->functionA(*(const_cast<ObjectA*>(obja)),*(const_cast<ObjectB*>(input)))) ;
我也尝试不使用const_cast
和指针,我尝试过:
const ObjectA a;
a.type() = somevalue;
a.value() = somevalue;
const stl::vector<ObjectB> input;
ObjectB objb;
objb.type() = some;
input.push_back(objb);
只需在测试中传递input
和a
作为参数即可。
但是我在a.type() = somevalue;
上收到一个错误,说"左键需要作为赋值的左操作数"
我认为这是因为ObjectA
班有两个type()
,一个是没有const
的二传手,一个是有const
的二传手。如果我声明a
为const
,它认为type()
是获取者而不是二传手,因此它不能是左侧值。这就是为什么我想使用const_cast
.
忘记const
,这不是问题,问题是指针的使用不必要,有时不正确。
查看您正在测试的函数的声明。
int functionA(const ObjectA& obja, const stl::vector<ObjectB>& objb)
那里没有指针。现在看看你尝试传递给函数的向量的声明。
stl::vector<ObjectB*>* input;
这是(指向)指针向量,这就是代码不起作用的原因。测试函数向量不是指针向量。下面介绍如何在没有任何指针的情况下编写代码。
ObjectA obja;
obja.type() = someValue; //setter function
obja.value() = someValue; // setter too
stl::vector<ObjectB> input;
ObjectB objb;
objb.type() = someValue // setter
objb.id() = someValue//setter
input.push_back(objb);
A* instanceA = A::getInstance();
EXPECT_EQ(-2, instanceA->functionA(obja, input));
容易多了。
您对const_cast
的使用是完全不必要的,可以删除。 首先,您将 non-const 转换为 non-const,这是多余的。而且,非常量对象可以直接分配给匹配类型的const
引用,因此您不需要强制转换。 但是,在input
的情况下,您甚至没有将其转换为兼容类型,因此您应该在该 cas 上出现编译器错误。
更重要的是,您没有为input
分配实际的stl::vector
对象,因此当您尝试取消引用input
时,您具有未定义的行为。
试试这个:
ObjectA *obja = new ObjectA();
obja->type() = someValue; //setter function
obja->value() = someValue; // setter too
stl::vector<ObjectB*> *input = new stl::vector<ObjectB*>();
ObjectB objb = new ObjectB();
objb->type() = someValue // setter
objb->id() = someValue//setter
input->push_back(objb);
A *instanceA = A::getInstance();
EXPECT_EQ(-2, instanceA->functionA(*obja, *input))
如果你摆脱了new
的所有用途,可以简化:
ObjectA obja;
obja.type() = someValue; //setter function
obja.value() = someValue; // setter too
stl::vector<ObjectB*> input;
ObjectB objb;
objb.type() = someValue // setter
objb.id() = someValue//setter
input.push_back(&objb);
A *instanceA = A::getInstance();
EXPECT_EQ(-2, instanceA->functionA(obja, input))