2014-02-23 11 views
11

Ich möchte eine Erwartung angeben, dass ein Wert zwischen einer oberen und unteren Grenze einschließlich ist.Erwarten Sie einen Wert innerhalb eines bestimmten Bereichs mit Google Test

Google Test bietet LT, LE, GT, GE, aber keine Möglichkeit, einen Bereich zu testen, den ich sehen kann. Sie könnten EXPECT_NEAR verwenden und die Operanden jonglieren, aber in vielen Fällen ist dies nicht so klar wie das explizite Festlegen der oberen und unteren Grenzen.

Verwendung sollte ähneln:

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

Wie würde man diese Erwartung hinzu?

Antwort

12

Google Mock hat reicher zusammensetzbare Matcher:

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

Vielleicht für Sie arbeiten würde.

+0

Danke, werde ich überprüfen [googlemock] (https://code.google.com/p/googlemock/). –

1

Am Ende habe ich ein Makro erstellt, das in der Google Test-Bibliothek anderen Makros ähnelt.

#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) 
+0

Leider führt dies zu einer Abhängigkeit von :: internen :: Namen, die sich ohne vorherige Ankündigung ändern können. Dies wird nicht unterstützt. –

+1

Warum nicht auf den öffentlichen Makros basieren und das oben erwähnte Problem vermeiden: 'EXPECT_GE (val, lower); EXPECT_LE (val, oberer); ' – David

3

Es gibt ein schönes Beispiel in 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; 
} 

Dann, es zu benutzen:

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

Mit nur Google-Test (nicht spotten), dann ist die einfache, offensichtliche Antwort ist, :

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

I finde das besser lesbar als einige der Mock-basierten Antworten.

+1

Problem hier ist, dass Fehler keine nützliche Information über die beteiligten Werte enthalten. –

1

Using an Existing Boolean Function in Google Test, die keine Google Mock brauchen. Der Link ist ziemlich spezifisch.

Hier ist das Beispiel.

// 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; 

die Assertion EXPECT_PRED2 (MutuallyPrime, a, b); wird erfolgreich sein, während die Behauptung EXPECT_PRED2 (MutualPrime, b, c); wird mit der

Meldung fehlschlagen
!MutuallyPrime(b, c) is false, where 

b is 4 

c is 10 
Verwandte Themen