2016-12-21 63 views
2

我開始對C嵌入式項目使用CppUTest。現在我正在處理系統的模擬呼叫。學會了之後如何通過Ç。典型類型中,例如:CppUtest:如何從模擬函數返回一個自定義結構

實例可以正常工作:代碼

模擬文件部分:

uint32_t LL_TIM_GetPrescaler(TIM_TypeDef * TIMx){  

    mock().actualCall("LL_TIM_GetPrescaler"); 
    return mock().unsignedIntReturnValue(); 
} 

測試文件的一部分與此模擬電話相關的代碼:

TEST (HAL_AS393,HAL_AS393x_Init_test) 
{ 
    ... 
    mock().expectOneCall("LL_TIM_GetPrescaler").andReturnValue(TEST_PRESCALER_VALUE); 
    //being TEST_PRESCALER_VALUE an int initialized variable before 
    ... 
} 

對理解這一點我沒有任何問題。

但是現在我試圖將一個結構從測試傳遞給一個模擬調用,並帶有我希望模擬發送到調用函數(被測生產代碼)的所需字段列表。這種情況正在用一些系統調用來測試一個函數。而這件事是這樣的:在測試的代碼

海賊王:

//struct type definition 

typedef struct 
{ 
    bool_t     WAKE_FLAG; 
    bool_t     DATA_READ_FLAG; 
}HAL_AS393X_Status; 

//function under test 
RFIDDrvStatus RFID_DRV_GetStatus(void) 
{ 
    HAL_AS393X_Status HAL_Status; 
    ...  
    HAL_Status=HAL_AS393x_GetStatus(); 
    ... 
} 

現在的想法是 - 使用模擬在我的測試文件 - :

TEST(RFID_Drv,RFID_DRV_GetStatus_test) 
{ 
    HAL_AS393X_Status FAKE_HAL_STATUS; 
    FAKE_HAL_STATUS.WAKE_FLAG=TRUE; 
    FAKE_HAL_STATUS.DATA_READ_FLAG=TRUE; 
    ... 
    mock().expectOneCall("HAL_AS393x_GetStatus").andReturnValue(FAKE_HAL_STATUS); 
    ... 
} 

我的問題是,如何在ord中構建mock.expectOneCall(「HAL_AS393x_GetStatus」)的mock.actualCall呃說它必須返回一個定義的類型結構(HAL_AS393X_Status)? 我serching對於如果可能的話,或者如果它存在,做這樣的信息:

mock().actualCall("HAL_AS393x_GetData"); 
return mock().XXXReturnValue();` 

什麼模擬語法必須是在剛上XXX的地方嗎?

+0

只是爲了澄清:是你的問題「怎麼回事定製模擬函數中的結構?「如果是,請編輯標題,但不清楚。標題說你想傳遞一個參數給模擬,身體說你想從模擬中返回自定義類型。這是一個很好的問題,如果你能更清楚一點,那將是非常棒的。 –

+0

我這麼認爲。我已經構建了一個結構體,其中填充了值(在測試方面),然後我需要說模擬調用將返回具有這些值的結構體。我想要的想法或者我想找到的東西是,如果有什麼辦法可以做到上面我做的,首先,例如,鍵入結構,而不是整數,char或bool,類型等。 –

+0

好的然後。試試我的答案,讓我知道結果。 –

回答

1

使用CppUMock returnPointerValueOrDefault,在返回之前進行轉換並取消引用。

你嘲笑函數體可以是這樣的:

static HAL_AS393X_Status default; 
mock().actualCall("HAL_AS393x_GetData"); 
return *(HAL_AS393X_Status *)mock().returnPointerValueOrDefault(&default);` 

而且在測試中,你希望像這樣的模擬:

TEST(RFID_Drv,RFID_DRV_GetStatus_test) 
{ 
    HAL_AS393X_Status FAKE_HAL_STATUS; 
    FAKE_HAL_STATUS.WAKE_FLAG=TRUE; 
    FAKE_HAL_STATUS.DATA_READ_FLAG=TRUE; 
    ... 
    mock().expectOneCall("HAL_AS393x_GetStatus").andReturnValue(&FAKE_HAL_STATUS); 
    ... 
} 
+0

謝謝Felipe L.我會試試這個。儘快我會分享我的結果。 –

相關問題