Я использую ящик макета для 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
должен работать на основе макетного документа. Я понятия не имею, почему пишет, что метод не найден.
@fdan Я новичок в ржавчине, поэтому у меня может быть ошибка в синтаксисе, но я думаю, что он должен возвращать тот же тип. Будет ли это связано с ошибкой returning
«Метод не найден»?
Замыкание возвращает bool
, а не ссылку на Data
. В любом случае, это не связано. Вам следует прочитать официальную документацию для возврата ссылок. Для неизменяемых ссылок необходимо использовать return_const
.
Метод next_data
возвращает ссылку, а не статическое значение. Метод returning
в этом случае не будет работать, потому что его замыкание должно будет возвращать ссылку на значение, которое, вероятно, создано самим замыканием. Поэтому для методов, возвращающих ссылки, вы должны использовать .return_const
вместо .returning
.
Однако это работает для изменяемых ссылок. Я никогда не пользовался этим ящиком, но, похоже, есть еще одна причина не поддерживать returning
.
Ну, я написал этот ящик и говорю вам, что причина именно в этом. Полная информация по ссылке docs.rs/mockall/latest/mockall/#reference-return-values .
Как вы думаете, замыкание возвращает тот же тип, что и
next_data
?