Testing 无法作为不可变借用,因为在验证是否调用了闭包时,它也作为可变借用

Testing 无法作为不可变借用,因为在验证是否调用了闭包时,它也作为可变借用,testing,rust,integration-testing,Testing,Rust,Integration Testing,我有一个函数,它采用闭包来执行与输出相关的逻辑(例如,显示到标准输出): 但我有一个错误: error[E0502]:无法将'output_message'作为不可变项借用,因为它也是作为可变项借用的 -->src/lib.rs:18:24 | 11 |让输出=|消息:字符串|{ |----------------此处发生可变借用 12 |输出消息=消息; |------由于在闭包中使用了“output\u message”,因此发生了上一次借用 ... 18 | assert_eq!(“bla

我有一个函数,它采用闭包来执行与输出相关的逻辑(例如,显示到标准输出):

但我有一个错误:

error[E0502]:无法将'output_message'作为不可变项借用,因为它也是作为可变项借用的
-->src/lib.rs:18:24
|
11 |让输出=|消息:字符串|{
|----------------此处发生可变借用
12 |输出消息=消息;
|------由于在闭包中使用了“output\u message”,因此发生了上一次借用
...
18 | assert_eq!(“blah”,输出_消息);
|^^^^^^^^^^^^^^^^^^此处发生不可变借用
19 | }
|-可变借用结束于此
是否有任何方法可以使用这种方法进行测试?我简短地搜索了一些模拟板条箱,但是所有的板条箱似乎都不经常更新,而且对于我的场景来说,它们都有点过头了


如果没有,是否有更好的方法来测试此函数?

您可以将匿名函数放在本地作用域中,以便在断言时删除它:

#[test]
fn should_work() {
    let mut output_message = String::from("");

    let result = {
        let output = |message: String| {
            output_message = message;
        };

        handle(output)
    };

    assert!(result.is_ok());
    assert_eq!("blah", output_message);
}

您可以将匿名函数放在本地作用域中,以便在断言时删除它:

#[test]
fn should_work() {
    let mut output_message = String::from("");

    let result = {
        let output = |message: String| {
            output_message = message;
        };

        handle(output)
    };

    assert!(result.is_ok());
    assert_eq!("blah", output_message);
}
内联闭包:

#[test]
fn should_work() {
    let mut output_message = String::from("");

    let result = handle(|message| {
        output_message = message;
    });

    assert!(result.is_ok());
    assert_eq!("blah", output_message);
}
这样,闭包是临时性的,在很长时间内不会借用该值。作为奖励,您可以避免闭包参数上的类型规范

或者等待几周,直到Rust 1.31,然后打开Rust 2018模式,该模式具有。

内联闭合:

#[test]
fn should_work() {
    let mut output_message = String::from("");

    let result = handle(|message| {
        output_message = message;
    });

    assert!(result.is_ok());
    assert_eq!("blah", output_message);
}
这样,闭包是临时性的,在很长时间内不会借用该值。作为奖励,您可以避免闭包参数上的类型规范


或者等待几周,直到Rust 1.31,然后打开Rust 2018模式,该模式有。

关于它的价值,你的代码。@SvenMarnach有趣,我不知道它的价值,你的代码。@SvenMarnach有趣,我不知道这一点,非常感谢。巧合的是,我也看到了你关于共享测试工具的答案:非常感谢。巧合的是,我刚才也看到了您关于共享测试实用程序的答案: