Как можно добиться условной компиляции с проектами Rust, в которых есть doctests?

Я использовал условную компиляцию для изменения сигнатуры типа функции, и теперь один и тот же doctest не может быть запущен для обоих "функциональных" режимов, поэтому мне нужен способ отказаться от doctest.

Я пытался слить #[cfg_attr(feature = "rss_loose", ignore)] используется в обычных тестах и ///rust,ignore делать ///rust,cfg_attr(feature = "rss_loose", ignore) но это не похоже на работу.

2 ответа

Просто напишите два разных комплекта документации и тестов, и все будет работать как есть:

/// ```
/// assert_eq!(42, dt::foo());
/// ```
#[cfg(not(feature = "alternate"))]
pub fn foo() -> u8 { 42 }

/// ```
/// assert_eq!(true, dt::foo());
/// ```
#[cfg(feature = "alternate")]
pub fn foo() -> bool { true }
$ cargo test
   Compiling dt v0.1.0 (file:///private/tmp/dt)
     Running target/debug/dt-c3e297f8592542b5

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured

   Doc-tests dt

running 1 test
test foo_0 ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
$ cargo test --features=alternate
   Compiling dt v0.1.0 (file:///private/tmp/dt)
     Running target/debug/dt-c3e297f8592542b5

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured

   Doc-tests dt

running 1 test
test foo_0 ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

По крайней мере, начиная с Rust 1.55 edition 2018, тест документации можно игнорировать с помощью такой аннотации:

      /// ```ignore
/// do_something();
/// ```

Более того, каждая строка комментария документации фактически переводится в отдельный атрибут, например:

      #[doc = "```ignore"]
#[doc = "do_something();"]
#[doc = "```"]

Это означает, что строка, говорящая ```ignoreусловно можно заменить, используяcfg_attrатрибут , с одним просто говоря ```, чтобы активировать тест:

      #[cfg_attr(feature = "extra-doctests", doc = "```")]
#[cfg_attr(not(feature = "extra-doctests"), doc = "```ignore")]
/// do_something();
/// ```

Когда тесты запускаются с extra-doctestsфункция включена, этот документ-тест будет работать нормально; когда эта функция отключена, она будет отображаться в журнале как «проигнорированная».

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