簡體   English   中英

如何編寫 function 存根來測試 Rust 模塊?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM