我有一个使用 mockall crate 中的 automock 实现的结构:
pub struct MyStruct {...}
#[cfg_attr(test, automock)]
impl MyStruct {
...
pub async fn my_struct_function() {...}
...
}
我需要测试
my_struct_function
是否被另一个异步方法调用了一次:
#[tokio::test]
async fn my_test() {
...
let mut my_struct_mock = MockMyStruct::default();
my_struct_mock.
.expect_my_struct_function()
.times(1)
.returning(...);
let result: Result<...> = OtherStruct::init_method(..., my_struct_mock, ...)
.other_async_method() // calls internally MockMyStruct::my_struct_function
.await;
...
}
目前,如果我将
times(1)
方法更改为其他一些值 N,测试仍然成功,因为代码在 tokio 线程中发生恐慌,而不是在主测试线程中。
我可以通过使用 nocapture
选项运行测试来验证它:
$ cargo test my_test -- --nocapture
thread '...tests::test_my_test' panicked at 'MockMyStruct::my_struct_function: Expectation(<anything>) called 1 time(s) which is fewer than expected N'
当函数调用的预期次数和实际调用次数不一致时,如何让测试失败?
我是Rust新手,网上搜索没能找到解决方案。但我希望在库级别有一个解决方案(tokio 测试的模拟)而不是“hack”。