如果线程恐慌,如何使 tokio 测试失败?

问题描述 投票:0回答:0

我有一个使用 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”。

unit-testing asynchronous rust mocking rust-tokio
© www.soinside.com 2019 - 2024. All rights reserved.