реализация 'std :: cmp :: PartialEq' недостаточно общая - PullRequest
3 голосов
/ 22 апреля 2020

Я пытаюсь использовать mockiato для имитации функции, которая принимает Option моей структуры A, но получает следующую ошибку.

error: implementation of `std::cmp::PartialEq` is not general enough
   --> src\main.rs:45:14
    |
45  |               .expect_do_feature(|arg| arg.partial_eq(Some(&cfg)))
    |                ^^^^^^^^^^^^^^^^^ implementation of `std::cmp::PartialEq` is not general enough
    |
    = note: `std::cmp::PartialEq<std::option::Option<&'1 A>>` would have to be implemented for the type `std::option::Option<&A>`, for any lifetime `'1`...
    = note: ...but `std::cmp::PartialEq` is actually implemented for the type `std::option::Option<&'2 A>`, for some specific lifetime `'2`

Я бы подумал, что #[derive(PartialEq)] на struct A сгенерирует то, что было нужно, но похоже, что он не совсем выполняет всю работу. Как мне реализовать то, что говорит мне компилятор?

use std::collections::HashMap;

#[cfg(test)]
use mockiato::mockable;

#[derive(PartialEq)]
pub struct A {
    pub data: HashMap<String, i32>,
}

impl A {
    pub fn new() -> Self {
        A {
            data: HashMap::new(),
        }
    }
}

pub struct B;

#[cfg_attr(test, mockable)]
pub trait ProvidesFeature {
    fn do_feature(&self, config: Option<&A>) -> Option<Vec<i32>>;
}

impl B {
    pub fn new() -> Self {
        B {}
    }

    pub fn do_feature(&self, config: Option<&A>) -> Option<Vec<i32>> {
        Some(vec!())
    }
}

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

    #[test]
    fn test_mocking() {
        let mut feature_mock = ProvidesFeatureMock::new();
        feature_mock
            .expect_do_feature(|arg| arg.partial_eq(None))
            .times(1..)
            .returns(Some(vec!()));
        assert_eq!(vec![0; 0], feature_mock.do_feature(None).unwrap());
    }
}

fn main() {
    println!("Hello, world!");
}

Для компиляции я использовал mockiato = "0.9.5" в Cargo.toml. Не забудьте запустить это с cargo test, если вы пытаетесь воспроизвести.

...