Ящик с макетом Rust, нет метода с именем `returning`

Я использую ящик макета для unittest.

#[cfg_attr(test, automock)]
pub trait Reader {
    fn next_data(&mut self) -> &Data;
}


impl Reader for TestReader {
    fn next_data(&mut self) -> &Data {
        let data: &Data = &self.data[self.index];
        self.index += 1;
        data
    }
}



fn test_reader() {
    let data_iter: IntoIter<Data> = (some vector Vec<Data>).into_iter();
    let mut reader = MockReader::new();
    reader
        .expect_next_data()
        .times(2)
        .returning(move || data_iter.clone().next().is_some());

Это сообщение об ошибке, которое я получаю

error[E0599]: no method named `returning` found for mutable reference `&mut __mock_MockReader_Reader::__next_data::Expectation` in the current scope
   --> src/tests/test_data.rs:177:14
    |
174 | /         reader
175 | |             .expect_next_data()
176 | |             .times(2)
177 | |             .returning(move || data_iter.clone().next().is_some());
    | |             -^^^^^^^^^ method not found in `&mut Expectation`
    | |_____________|
    | 

Как мне с этим справиться? returning должен работать на основе макетного документа. Я понятия не имею, почему пишет, что метод не найден.

Как вы думаете, замыкание возвращает тот же тип, что и next_data?

fdan 22.07.2024 14:30

@fdan Я новичок в ржавчине, поэтому у меня может быть ошибка в синтаксисе, но я думаю, что он должен возвращать тот же тип. Будет ли это связано с ошибкой returning «Метод не найден»?

leeway00 22.07.2024 16:57

Замыкание возвращает bool, а не ссылку на Data. В любом случае, это не связано. Вам следует прочитать официальную документацию для возврата ссылок. Для неизменяемых ссылок необходимо использовать return_const.

fdan 22.07.2024 21:51
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод next_data возвращает ссылку, а не статическое значение. Метод returning в этом случае не будет работать, потому что его замыкание должно будет возвращать ссылку на значение, которое, вероятно, создано самим замыканием. Поэтому для методов, возвращающих ссылки, вы должны использовать .return_const вместо .returning.

Однако это работает для изменяемых ссылок. Я никогда не пользовался этим ящиком, но, похоже, есть еще одна причина не поддерживать returning.

fdan 24.07.2024 12:06

Ну, я написал этот ящик и говорю вам, что причина именно в этом. Полная информация по ссылке docs.rs/mockall/latest/mockall/#reference-return-values ​​ .

Alan Somers 26.07.2024 18:39

Другие вопросы по теме