如何为需要“静态寿命”引用并实现Sync的函数赋予模拟值?

llxxbb

我用模拟程序测试了我的项目。我不知道哪种类型转换是必需的say_hello_brother下面是简化的代码列表:

#![feature(plugin, custom_derive)]
#![plugin(mockers_macros)]
#[cfg(test)]
extern crate mockers;

use mockers::Scenario;

#[derive(Mock)]
trait SayHello {
    fn hello(&self);
}

// assume `SayHello` is a service and  worked on multiple threads
fn say_hello_brother<T: SayHello + Sync>(brother: &'static T) {
    brother.hello()
}

#[test]
fn test_sya_hello() {
    let scenario = Scenario::new();
    let mock = scenario.create_mock_for::<SayHello>();
    say_hello_brother(&mock)
}

货代

[package]
name = "mock"
version = "0.1.0"
authors = ["llxxb"]

[dependencies]
mockers = "0.9.4"
mockers_macros = "0.9.4"

和错误信息:

error[E0277]: the trait bound `std::rc::Rc<std::cell::RefCell<mockers::ScenarioInternals>>: std::marker::Sync` is not satisfied in `SayHelloMock`
  --> src\lib.rs:22:5
   |
22 |     say_hello_brother(&mock)
   |     ^^^^^^^^^^^^^^^^^ `std::rc::Rc<std::cell::RefCell<mockers::ScenarioInternals>>` cannot be shared between threads safely
   |
   = help: within `SayHelloMock`, the trait `std::marker::Sync` is not implemented for `std::rc::Rc<std::cell::RefCell<mockers::ScenarioInternals>>`
   = note: required because it appears within the type `SayHelloMock`

更新经过一番尝试,我成功附加SyncSayHelloMock新的lib.rs:

#![feature(plugin, custom_derive)]
#![plugin(mockers_macros)]
#[cfg(test)]
extern crate mockers;

use mockers::Scenario;

trait SayHello {
    fn hello(&self);
}


mock! {
    SayHelloMock,
    self,
    trait SayHello {
        fn hello(&self);
    }
}

unsafe impl Sync for SayHelloMock {}


// assume `SayHello` is a service and  worked on multiple threads
fn say_hello_brother<T: SayHello + Sync>(brother: &'static T) {
    brother.hello()
}

#[test]
fn test_sya_hello() {
    let scenario = Scenario::new();
// not work
//    let mock = scenario.create_mock::<SayHelloMock>();
//    static MOCK: SayHelloMock = || { mock };
//    say_hello_brother(&MOCK)

    // not work yet
    let mock : &'static SayHelloMock = &(scenario.create_mock::<SayHelloMock>());
    say_hello_brother(mock)
}

但我仍然无法将其转换为“静态错误信息:

error[E0597]: borrowed value does not live long enough
--> src\lib.rs:38:41
|
38 |     let mock : &'static SayHelloMock = &(scenario.create_mock::<SayHelloMock>());
|                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ temporary value does not live long enough
39 |     say_hello_brother(mock)
40 | }
| - temporary value only lives until here
|
= note: borrowed value must be valid for the static lifetime...
Shepmaster

不能为此目的使用模拟程序库,因为它生成的模拟程序不是线程安全的

话虽如此,没有什么限制您创建自己的线程安全的模拟程序:

use std::sync::atomic::{AtomicUsize, Ordering};

#[derive(Debug, Default)]
struct MyMock {
    call_count: AtomicUsize,
}

impl SayHello for MyMock {
    fn hello(&self) {
        self.call_count.fetch_add(1, Ordering::SeqCst);
    }
}

但是,您的签名需要一个&'static T,这实际上可能是一个糟糕的主意。您将需要使用类似惰性的东西:

#[macro_use]
extern crate lazy_static;

#[test]
fn test_say_hello() {
    lazy_static! { 
        static ref MOCK: MyMock = MyMock::default();
    };
    say_hello_brother(&*MOCK);
    assert_eq!(MOCK.call_count.load(Ordering::SeqCst), 1);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为构造函数生成的右值赋予左值生存期?

如何使用main中创建的变量调用需要“静态寿命”的函数?

如何在pytest中为模拟函数赋予不同的返回值?

命令需要文件路径。如何为“ infile”赋予标准输入,为“ outfile”赋予标准输出?

如何在junit中模拟静态引用?

如何为通用参数赋予默认值?

使用JUnitParams的@FileParameters时如何为参数赋予空值

如何为表中的 TableColumn 赋予默认值

如何为包含引用的结构实现AsRef

如何引用C中出现在需要它的函数之后的静态数据?

如何为循环的每次迭代从R中的函数返回多个值?简单的生活史模拟

如何为UIBezierPath赋予cornerRadius

您如何为函数实现__str__?

如何为链表实现len()函数?

如何使用loc函数为每个索引赋予单独的值?

如何实现静态虚拟成员函数

Moq - 如何为泛型基类的方法实现模拟?

如何为Kotlin数据类模拟或实现IS-A关系

如何为值数组实现类似于ISBETWEEN的函数,而不必多次计算数组?

如何为静态类内的静态对象的属性分配值?

需要非静态成员函数的 C++ 引用

如何在Jest的模拟模块中更改函数的模拟实现

为什么赋予qsort()的比较函数需要返回三个不同的值?

Rust函数没有静态寿命吗?

如何替换引用相同的类似写入值(赋予它们相同的值)?

如何为通过JavaScript中的对象文字模拟的命名函数参数设置默认值?

如何为Handsontable中的所有空白单元格赋予默认值0?

如何为object-2的变量赋予与object-1中的变量相同的值?

如何为与Java相关的fold()函数实现函数签名?