Как мне написать тест, гарантирующий ошибку компиляции? - PullRequest
2 голосов
/ 24 марта 2019

Я хочу доказать, что мой API статически предотвращает недопустимое использование, не компилируя.

Существует инструмент для обеспечения того, что код паникует во время выполнения (#[should_panic]), но я не смог найтичто-нибудь для сбоя компиляции.Док-тесты кажутся наиболее многообещающими, потому что каждый фрагмент - это отдельная единица компиляции, но паническая проверка - это все, что кажется.

1 Ответ

4 голосов
/ 24 марта 2019

В настоящее время нет способа указать, что обычный тест не должен компилироваться. И, судя по сопутствующим вопросам ( # 521 и # 1994 ), что-то вроде #[compile_fail] вряд ли станет доступно в ближайшее время.

Однако есть два других способа написания этих тестов.

Doctests

Начиная с Rust 1.22 , вы можете выполнить doc тесты , которые, как предполагается, не скомпилируются, пометив фрагмент кода с помощью compile_fail:

/// Foos a bar.
/// 
/// # Example
///
/// ```compile_fail
/// foo(3); // 3 is not a bar
/// ```
fn foo(bar: Bar) {
}

Инструментарий для компиляции

Инструменты для тестирования компиляции, используемые внутри проекта Rust, были извлечены в специальный ящик compiletest_rs.

С шаблоном, предложенным в документации , можно написать тесты на сбой компиляции в папке tests/compile-fail:

fn main() {
   let x: bool = 0;
}

Смотри также:


Тем не менее, эти тесты должны быть написаны с осторожностью. Цитата из анонса compile_fail:

Обратите внимание, что такие тесты могут быть более хрупкими, чем другие, так как добавления в Rust могут привести к компиляции кода, если раньше этого не происходило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...