没有默认构造函数时如何在 Googletest 夹具中定义变量?
How to define variables in Googletest fixtures when they do not have a default constructor?
我有以下
#include <semsim/Subject.h>
#include <semsim/Triple.h>
#include "gtest/gtest.h"
class TripleTests : public ::testing::Test {
public:
std::string subject_str;
semsim::Subject subject;
void SetUp() override {
subject_str = "./MyModel#metaid_0";
subject = semsim::Subject(subject_str);
}
};
TEST_F(TripleTests, TestSubjectMetaId) { // this line causes the error
std::cout << subject << std::endl;
}
为了定义变量(供以后在 TEST_F
函数中使用),必须在 class 范围内创建它们,然后在 SetUp
方法中填充一个值.这是因为我无法将 subject_str
传递给 class 级别的 Subject
。但是,如果在 class 级别实例化变量,它会使用默认构造函数,而我的 class 没有(也不需要)默认构造函数。这是我 IDE 的投诉:
Call to implicitly-deleted default constructor of 'TripleTests' because field 'subject' has no default constructor
因此我的问题是:在不需要定义默认构造函数的情况下,我如何在 TripleTest
class 中创建一个主题 object 以便它可以在 [=15] 中使用=] 功能?或者是否有必要在 Suject
中默认构造函数,以便我可以在测试夹具中创建一个?
供参考,Subject
header 如下所示:
class Subject {
private:
std::string metaId;
public:
explicit Subject(std::string metaId) : metaId(std::move(metaId)) {};
const std::string &getMetaId() const;
bool operator==(const Subject &rhs) const;
bool operator!=(const Subject &rhs) const;
friend std::ostream &operator<<(std::ostream &os, const Subject &subject);
};
}
编辑
@Tomasz 的回答
class TripleTests : public ::testing::Test {
public:
std::string subject_str;
semsim::Subject subject;
// alternative 1
TripleTests() {
this->subject_str = "./MyModel#metaid_0";
semsim::Subject s(subject_str);
this->subject = s;
}
// alternative 2
TripleTests() {
this->subject_str = "./MyModel#metaid_0";
this->subject = semsim::Subject(subject_str);
}
结果
Constructor for 'TripleTests' must explicitly initialize the member 'subject' which does not have a default constructor. Isn't the line `this->subject = s` initialising the member `subject`?
您必须使用 fixture 的构造函数而不是 SetUp()
来初始化初始化列表中的成员:
class TripleTests : public ::testing::Test {
public:
std::string subject_str;
semsim::Subject subject;
TripleTests()
: subject_str("./MyModel#metaid_0")
, subject(subject_str)
{
}
};
我有以下
#include <semsim/Subject.h>
#include <semsim/Triple.h>
#include "gtest/gtest.h"
class TripleTests : public ::testing::Test {
public:
std::string subject_str;
semsim::Subject subject;
void SetUp() override {
subject_str = "./MyModel#metaid_0";
subject = semsim::Subject(subject_str);
}
};
TEST_F(TripleTests, TestSubjectMetaId) { // this line causes the error
std::cout << subject << std::endl;
}
为了定义变量(供以后在 TEST_F
函数中使用),必须在 class 范围内创建它们,然后在 SetUp
方法中填充一个值.这是因为我无法将 subject_str
传递给 class 级别的 Subject
。但是,如果在 class 级别实例化变量,它会使用默认构造函数,而我的 class 没有(也不需要)默认构造函数。这是我 IDE 的投诉:
Call to implicitly-deleted default constructor of 'TripleTests' because field 'subject' has no default constructor
因此我的问题是:在不需要定义默认构造函数的情况下,我如何在 TripleTest
class 中创建一个主题 object 以便它可以在 [=15] 中使用=] 功能?或者是否有必要在 Suject
中默认构造函数,以便我可以在测试夹具中创建一个?
供参考,Subject
header 如下所示:
class Subject {
private:
std::string metaId;
public:
explicit Subject(std::string metaId) : metaId(std::move(metaId)) {};
const std::string &getMetaId() const;
bool operator==(const Subject &rhs) const;
bool operator!=(const Subject &rhs) const;
friend std::ostream &operator<<(std::ostream &os, const Subject &subject);
};
}
编辑
@Tomasz 的回答
class TripleTests : public ::testing::Test {
public:
std::string subject_str;
semsim::Subject subject;
// alternative 1
TripleTests() {
this->subject_str = "./MyModel#metaid_0";
semsim::Subject s(subject_str);
this->subject = s;
}
// alternative 2
TripleTests() {
this->subject_str = "./MyModel#metaid_0";
this->subject = semsim::Subject(subject_str);
}
结果
Constructor for 'TripleTests' must explicitly initialize the member 'subject' which does not have a default constructor. Isn't the line `this->subject = s` initialising the member `subject`?
您必须使用 fixture 的构造函数而不是 SetUp()
来初始化初始化列表中的成员:
class TripleTests : public ::testing::Test {
public:
std::string subject_str;
semsim::Subject subject;
TripleTests()
: subject_str("./MyModel#metaid_0")
, subject(subject_str)
{
}
};