2011-02-25 66 views
3

我有一個小類:Googlemock:如何驗證對象中數組中的元素?

struct Command 
{ 
    uint8_t cmdId; 
    uint8_t len; 
    uint8_t payload[MAX_PAYLOAD]; 
}; 

我想驗證只使用googlemock期望有效載荷的前兩個元素。我無法使用ElementsAreArray,因爲它會檢查有效負載的長度和期望值是否相同。到目前爲止,我有這樣的期望:

Command cmd; 
cmd.cmdId = 0xD3; 
cmd.len = 2; 
cmd.payload[0] = 'm'; 
cmd.payload[1] = 'l'; 

EXPECT_CALL(mockQueue, 
     sendFromIsr(Pointee(AllOf(
       Field(&Command::cmdId, Eq(0xD3)), 
       Field(&Command::len, Eq(2)), 
       //Field(&BirdCommand::payload, ElementsAreArray(cmd.payload, 2)) !<-- Doesn't work 
     )))) 
     .WillOnce(Return(true)); 

任何想法?模擬類看起來是這樣的:

template <typename T> 
class MockQueue : public Queue<T> 
{ 
public: 
    MOCK_METHOD1_T(sendFromIsr, bool(T &item)); 
}; 
+0

sendFromIsr方法的簽名是什麼? – 2011-02-25 13:20:16

+0

@VJo我添加了模擬定義 – mikelong 2011-02-25 13:24:15

回答

2

我已通過googlemock郵件列表discussion here從Piotr Gorak收到此解決方案。

MATCHER_P2(CheckFirstTwo, first, second, "Checks the first two elements of an array") 
{ 
    return arg[0] == first && arg[1] == second; 
} 

而且在測試中我驗證這樣的:

EXPECT_CALL(mockQueue, sendFromIsr(
     Pointee(AllOf(
      Field(&BirdCommand::cmdId, Eq(0xD3)), 
      Field(&BirdCommand::len, Eq(2)), 
      Field(&BirdCommand::payload, CheckFirstTwo('m', 'l')) 
     )) 
)); 

我喜歡這個解決方案最,因爲它不要求我過指定測試或零在我的生產初始化數據結構代碼不必要。

+0

這是爲什麼被拒絕?它完全解決了我如何指定它的問題。 – mikelong 2011-02-28 09:23:36

2

什麼是錯的:

EXPECT_CALL(mockQueue, sendFromIsr(Ref(cmd)) 
     .WillOnce(Return(true)); 

由於命令是POD,它應該可以工作,即使它複製命令(在這種情況下它不會)。


編輯

因爲該命令是POD,你需要零初始化(或當您創建它清除這種物體所佔用的內存在您的例子:

Command cmd = Command(); 

然後您的對象將不會被初始化,並且比較不會失敗。

+0

感謝您的回覆。不幸的是,這不會工作,因爲整個消息沒有寫入。這意味着剩餘的有效載荷將有所不同(但沒關係,因爲它們是無效的)。 – mikelong 2011-02-25 13:59:47

+0

@mikelong也許是因爲你的命令是POD,並且像你聲明的變量'cmd'那樣它可能包含垃圾。嘗試將它初始化爲零,並查看它是否有效。 – 2011-02-25 15:06:32

-1

您試過

EXPECT_CALL(mockQueue, 
     sendFromIsr(Pointee(AllOf(
       Field(&Command::cmdId, Eq(0xD3)), 
       Field(&Command::len, Eq(2)), 
       Field(&Command::payload[0], Eq('m')), 
       Field(&Command::payload[1], Eq('l')) 
     )))) 
     .WillOnce(Return(true)); 
+0

是的,不幸的是,它不能編譯。 g ++消息是「錯誤:引用'Command :: payload'時丟失了對象」 – mikelong 2011-02-25 14:44:58

相關問題