2014-02-23 53 views
11

我想指定一個值,該值包含在上限和下限之間。 Google測試提供LT,LE,GT,GE,但沒有辦法測試我可以看到的範圍。您可以使用EXPECT_NEAR並調整操作數,但在許多情況下,這並不像明確設置上限和下限那麼明顯。使用Google測試期望值在給定範圍內

用法應類似於:

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

一個怎麼想補充一點的期望?

回答

12

谷歌模擬具有更豐富的組合的匹配器:

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

也許這會爲你工作。

+0

謝謝,我會檢查出[googlemock(https://code.google.com/p/googlemock/)。 –

1

最後,我創建了一個宏來執行此操作,它類似於Google Test lib中的其他宏。

#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

不幸的是,這引入了對:: internal :: names的依賴,這些名稱可能會在沒有通知的情況下更改。這不支持。 –

+1

爲什麼不把它建立在公共宏上,並避免上述問題:'EXPECT_GE(val,lower); EXPECT_LE(val,upper);' – David

3

有在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

只使用谷歌測試(不嘲笑),然後是簡單的,明顯的答案是:

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

I發現這比一些基於Mock的答案更具可讀性。

+1

這裏的問題是,失敗並不包含任何有關涉及值的有用信息。 –

1

Using an Existing Boolean Function在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 
相關問題