2016-07-15 85 views
1

我班的構造函數打開一個文件並從中讀取一些數據。構造函數不接受任何參數。用gtest測試構造函數內部條件的方法是什麼?

文件打開部分必須在構造函數內完成。

用gtest測試這樣一個構造函數中的條件的方法是什麼?

+0

如果你想測試你的構造函數,你可以在錯誤的情況下拋出它,並測試沒有拋出。 您可能需要重新設計,將一些參數作爲'stream'或其他接口來允許嘲笑它並更好地控制以測試您的類。 – Jarod42

+0

我同意以前的評論。使用依賴注入並注入真實對象或模擬實際文件打開。 –

回答

-1

快速回答是:現在有您提供的信息。

但是,如果您打開的文件句柄或任何相關的標誌/變量受到保護,則gtest的一項技術是繼承您的類並使用派生類訪問該數據並對其進行測試。

作爲一個方面說明,構造函數不應該做任何事情:在你的例子中,想象一下,由於任何原因文件系統不允許你打開文件。這是如何影響班級行爲的?你不能說。因此,您的班級中可能存在未定義的行爲,您無法對其進行任何控制。
更糟糕的是拋出異常建議,出於同樣的原因。在您的構造函數中使用依賴注入,或者使您的類成爲模板類,以便您可以控制注入的策略。

+1

在構造函數中拋出異常以指示錯誤條件是一種標準且可接受的編碼模式 – Smeeheey

+0

@Smeetheey:在Web上有這方面的討論。拋出異常是標準_but_你必須記住要從外部捕獲它,也就是說,你必須承擔你的類構造函數的副作用。使用'init()'方法是有效的,但是你必須注意多線程環境。在bpth的情況下,你必須在外面做一些事情,但是如果你拋出構造函數,你必須假設類API中沒有的行爲。這是某種口味。 – fedino

+1

是的,這是一個選擇的問題。兩種方法都是有效的,人們可以有偏好。所以我不同意你的回答中丟棄方法的失效。另外:*「作爲一個側面說明,施工人員不應該做的東西」 - - 這是一個意見(一個在相信RAII的人面前飛行)表示爲接受的事實。 – Smeeheey