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有趣,我不知道这一点,非常感谢。巧合的是,我也看到了你关于共享测试工具的答案:非常感谢。巧合的是,我刚才也看到了您关于共享测试实用程序的答案: