Ожидайте значения в заданном диапазоне с помощью Google Test

Я хочу указать, что значение находится между верхней и нижней границами, включительно.

Google Test предоставляет LT, LE, GT, GE, но не позволяет тестировать диапазон, который я могу видеть. Вы можете использовать EXPECT_NEAR и жонглировать операндами, но во многих случаях это не так ясно, как явное определение верхней и нижней границ.

Использование должно напоминать:

EXPECT_WITHIN_INCLUSIVE(1, 3, 2); // 2 is in range [1,3]

Как добавить это ожидание?

Ответ 1

Google mock имеет более богатые составные сокеты:

EXPECT_THAT(x, AllOf(Ge(1),Le(3)));

Возможно, это сработает для вас.

Ответ 2

В "google mock cheat sheet" есть приятный пример:

using namespace testing;
MATCHER_P2(IsBetween, a, b,
           std::string(negation ? "isn't" : "is") + " between " + PrintToString(a)
           + " and " + PrintToString(b))
{
    return a <= arg && arg <= b;
}

Затем, чтобы использовать его:

TEST(MyTest, Name) {
    EXPECT_THAT(42, IsBetween(40, 46));
}

Ответ 3

Используя только Google Test (не макет), тогда простой, очевидный ответ:

EXPECT_TRUE((a >= 1) && (a <= 3)); // a is between 1 and 3 inclusive

Я нахожу это более читаемым, чем некоторые из ответов на основе Mock.

Ответ 4

В конце я создал макрос для этого, который напоминает другие макросы в тестовой библиотеке Google.

#define EXPECT_WITHIN_INCLUSIVE(lower, upper, val) \
  do { \
    EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val, lower); \
    EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val, upper); \
  } while (0)

Ответ 5

Использование существующей логической функции в Google Тесте, который не нужен Google mock. Ссылка довольно конкретна.

Вот пример.

// Returns true iff m and n have no common divisors except 1.
bool MutuallyPrime(int m, int n) { ... }
const int a = 3;
const int b = 4;
const int c = 10;

утверждение EXPECT_PRED2 (MutuallyPrime, a, b); будет успешным, в то время как утверждение EXPECT_PRED2 (MutuallyPrime, b, c); потерпит неудачу с сообщение

!MutuallyPrime(b, c) is false, where

b is 4

c is 10