You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Tauri命令编写测试:如何在测试环境中访问与管理状态

Tauri带状态命令的测试方法

核心思路

测试带状态的Tauri命令时,无需启动完整Tauri应用:要么直接构造MyState实例并通过tauri::State包装后传入命令函数做单元测试;要么用Tauri提供的测试工具创建模拟应用,验证跨调用的状态持续性。

1. 单元测试实现

直接针对命令函数编写测试,手动控制状态初始化与结果验证:

#[cfg(test)]
mod tests {
    use super::*;
    use tauri::State;

    #[test]
    fn test_hello_world_with_initial_value() {
        // 初始化测试状态,手动设置初始字符串
        let my_state = MyState {
            s: std::sync::Mutex::new("Hello".to_string()),
            t: Default::default(),
        };

        // 将状态包装成命令所需的tauri::State类型
        let state = State::new(&my_state);

        // 调用命令函数
        let output = hello_world(state);

        // 验证返回值和状态变更
        assert_eq!(output, "Hello world");
        assert_eq!(*my_state.s.lock().unwrap(), "Hello world");
    }

    #[test]
    fn test_hello_world_empty_initial_state() {
        let my_state = MyState::default();
        let state = State::new(&my_state);
        
        let output = hello_world(state);
        assert_eq!(output, " world");
    }
}

2. 集成测试实现(模拟完整应用)

如果需要验证状态在多次命令调用间的持续性,可用mock_app创建模拟应用,注册状态和命令后通过invoke调用:

#[cfg(test)]
mod integration_tests {
    use super::*;
    use tauri::test::{mock_app, invoke};

    #[test]
    fn test_persistent_state_across_invocations() {
        let app = mock_app(|app| {
            // 向模拟应用注册状态
            app.manage(MyState::default());
            // 注册命令处理器
            app.invoke_handler(tauri::generate_handler![hello_world]);
        });

        // 第一次调用命令
        let first_result: String = invoke(&app, "hello_world", ()).unwrap();
        assert_eq!(first_result, " world");

        // 第二次调用,验证状态被持续修改
        let second_result: String = invoke(&app, "hello_world", ()).unwrap();
        assert_eq!(second_result, " world world");
    }
}

注意事项

  • 测试中使用lock().unwrap()是安全的:测试环境无并发竞争,不会出现锁Poison的情况。
  • 若要测试并发场景,可通过std::thread::spawn模拟多线程调用,但需确保锁的正确使用。

内容的提问来源于stack exchange,提问作者nima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:33:19