Тестирование приватных свойств структуры

Неужели не реально в тестовом модули, переопределять приватные свойства структуры?

mod A{
    struct Test{
        field: u8
    }
}
mod B{}

#[cfg(test)]
mod test{
    #[test]
    fn test(){
    let t = super::A::Test{
        field: 3
    };
    assert_eq!(3,t.field);
    }
}

Нужно протестировать модуль B, но при тесте необходима структура из модуля А, которая имеет приватные поля.

Аналогично java/c# можно использовать для поля field в структуре Test модификаторы видимости. Даже более гибко.

Например, можно сделать поле видимым для всего крейта, но недоступным за его пределами (аналог internal из C#)

mod A{
  pub struct Test{
      pub(crate) field: u8
  }
}

https://doc.rust-lang.org/reference/visibility-and-privacy.html

3 лайка

Спасибо :grinning: Как раз то что нужно. Нужно будет найти все таки время на второе издание))) По поводу более гибко, не совсем согласен, в шарпе есть такая конструкция [assembly: InternalsVisibleTo("MyTestAssembly")], которая тоже дает подобные возможности. Конечно в идеале, хотелось бы, чтоб модуль помеченный #[cfg(test)] имел доступ к приватным свойствам всего crate, а не как сейчас только модуля в котором он находится

Я так понимаю, что идиоматичным в расте считается код для тестов нашпиговывать типажами и через них мокать всякое, а в приватную часть как раз не сильно лезть. Но это уже такое, филосовские холивары про подходы. :slight_smile:

Тут видишь какое дело… я использую генератор rust-qt-binding-generator. Он мне генерирует 2 файла. В одном я сам себе хозяин, второй имеет все существующие обвязки с С(interface). И вот получается что я протестить получается это дело не могу, даже с написанием pub(crate) или прочего. Потому что не владею тем файлом совсем. А он создает структуру, которую передаст мне для работы. И ее я ни как замокать не могу…

Получается все равно придется делать какой-то объект аля logic и использовать его во всех местах. Плюс тесты на qt которые. Только так получается я смогу выйти из сложившейся ситуации.