[英]How does one write function stubs for testing Rust modules?
在我過去測試 C 代碼的經驗中,function 存根幾乎是強制性的。 在我的安全關鍵工作中,我通常需要測試所有內容 - 甚至是簡單地調用特定於構建的實現參數作為參數的抽象函數,返回作為返回。
我已經在 Rust 中搜索了很多方法來測試模塊外部的存根函數,但找不到解決方案。
有幾個用於 trait-mocking 的庫,但我對這個主題的閱讀很少表明它不是我想要的。
另一個建議是我測試的調用外部函數的函數傳入了這些函數,允許測試簡單地通過所需的偽存根 function。 就傳入和傳出偽存根的數據而言,這似乎非常不靈活,並導致代碼在每個級別都被函數引用 arguments 污染 - 當被測試的 function 除了一個可操作的 ZCA384F1AB4068E6 之外永遠不會調用任何東西時,這是非常不可取的存根。 您正在編寫操作代碼以適應測試系統的限制。
這似乎非常基本。 肯定有辦法用 Rust 和 Cargo 存根外部函數嗎?
您可以嘗試使用mockall 之類的模擬 crates,我認為它更完整,但可能仍需要一些時間來適應。
如果沒有模擬板條箱,我建議 mocking 將特征/結構放在另一個中,然后使用#[cfg(test)]
屬性將其帶入 scope 中。 當然,這將強制您使用 `#[cfg(not(test))] 注釋production
使用語句。 例如:
如果您使用external-crate
中的外部結構ExternalStruct
和方法external_method
,您將有如下內容:
文件real_code.rs
#[cfg(not(test))]
use external-crate::ExternalStruct;
#[cfg(test)]
use test_mocks::ExternalStruct;
fn my_function() {
//...
ExternalTrait::external_method();
}
#[test]
fn test_my_function(){
my_function();
}
文件test_mocks.rs
:
pub Struct ExternalStruct {}
impl ExternalStruct {
pub fn external_method() {
//desired mock behaviour
}
}
在運行測試時,將使用 test_mocks 中的 ExternalStruct,否則將使用真正的依賴項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.