Есть ли что-то типа EQUALS в Catch c++?

175
20 марта 2019, 22:20

Ситуация такая, есть класс, в котором перегружены операторы сложения и равенства, нужно написать юнит-тесты к этому классу (например, c1 + c2 == c3, где c1, c2, c3 - объекты класса). Вопрос: как это сделать?

Знаю, что в VS используют AreEqual для таких целей, есть ли здесь что-то такое и как решить проблему? Использование REQUIRE и REQUIRE_THAT порождает ошибки.

Например: есть класс ComplexNum В нём перегружены операторы следующим образом:

ComplexNum ComplexNum::operator + (const ComplexNum &comp) {
    ComplexNum temp;
    temp.re = this->re + comp.re;
    temp.im = this->im + comp.im;
    return temp;
}
bool ComplexNum::operator == (const ComplexNum &comp) {
    return this->re == comp.re && this->im == comp.im;
}

Мы имеем объекты

ComplexNum c1(2, 3);
ComplexNum c2(-8, 7);
ComplexNum c3(-6, 10);

И нужно протестировать на верность равенства, следующее выражение, например, вызовет ошибку. Как это сделать правильно?

REQUIRE((c1 + c2)== c3);
Answer 1

Проблема заключается в том, что Ваш operator== неконстантный, что, в принципе, некорректно, но приемлемо. Тем не менее, Catch используется переданные аргументы как ссылки на константные объекты, в результате чего он требует от operator== быть либо константным членом класса, либо свободной функцией для двух аргументов, оба которых являются ссылкой на константу.

В целом, Catch требует от Вас не совсем справедливо, т.к. не фреймворку решать, но это, на самом деле, правильно реализовывать оператор сравнения либо как константный, либо как свободную функцию (второе предпочтительно, хотя в данном случае и не принципиально). Т.е. минимальные изменения, чтобы заставить этот код работать будут такими:

bool ComplexNum::operator == (const ComplexNum &comp) const {
    return this->re == comp.re && this->im == comp.im;
}

На будущее: приводите всю релеватную информацию в вопросе и не скриншотами. Код, текст ошибок — всё, что помогает людям понять Вашу проблему.

READ ALSO
Проблема с I/O в процессе или трубе(pipe)

Проблема с I/O в процессе или трубе(pipe)

Задача - выполнить последовательность команд в дочерней консоли Windows и записать их вывод в родительскую консольАлгоритм программы, если...

236
Объясните пожалуйста код [закрыт]

Объясните пожалуйста код [закрыт]

Я немного не понимаю данный код, а точнее кусок кода, связанный с массивом и циклом for

145
Как вставить строку в строку после определенного символа?

Как вставить строку в строку после определенного символа?

Необходимо вставить строку в другую строку, но после определенного символаБез использования String и других библиотек

224
Динамическая смена ui файлов в Qt

Динамическая смена ui файлов в Qt

Изучаю Qt, наткнулся на такую проблемуМне требуется быстро менять ui файлы по ходу выполнения программы

181