代码之家  ›  专栏  ›  技术社区  ›  m00am

如何对使用板条箱特性的函数进行doctest?

  •  1
  • m00am  · 技术社区  · 7 年前

    我试图为使用 sysinfo 大木箱虽然代码工作得很好,但我无法编译doctest。最简单的示例如下所示:

    lib。卢比
    extern crate sysinfo;
    
    use sysinfo::SystemExt;
    
    /// Test
    ///
    /// ```
    /// sysinfo_error::read_sysinfo()
    /// ```
    pub fn read_sysinfo() {
        let mut system = sysinfo::System::new();
    }
    

    运行时,此代码按预期工作(编译,不执行任何操作),但当我运行时 cargo test 出现以下错误:

    running 1 test
    test src/lib.rs - read_sysinfo (line 7) ... FAILED
    
    failures:
    
    ---- src/lib.rs - read_sysinfo (line 7) stdout ----
            error: linking with `cc` failed: exit code: 1
      |
      = note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/tmp/rustdoctest.mkPht54FLMyA/rust_out.rust_out0.rcgu.o" "-o" "/tmp/rustdoctest.mkPht54FLMyA/rust_out" "/tmp/rustdoctest.mkPht54FLMyA/rust_out.crate.allocator.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-z,relro,-z,now" "-nodefaultlibs" "-L" "/home/me/repos/rust_book/sysinfo_error/target/debug/deps" "-L" "/home/me/repos/rust_book/sysinfo_error/target/debug/deps" "-L" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/home/me/repos/rust_book/sysinfo_error/target/debug/deps/libsysinfo_error-ad346d9cb3d265cb.rlib" "-L" "/home/me/repos/rust_book/sysinfo_error/target/debug/deps" "-Wl,-Bdynamic" "-l" "sysinfo-bde19d7fa61f93a0" "-Wl,-Bstatic" "/home/me/repos/rust_book/sysinfo_error/target/debug/deps/libcfg_if-34509d450d3a6e7b.rlib" "/home/me/repos/rust_book/sysinfo_error/target/debug/deps/liblibc-b1ca85687f9f2272.rlib" "-L" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bdynamic" "-l" "std-58a9e2944951d97f" "-Wl,-Bstatic" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-a6b6fad6cc543169.rlib" "-Wl,-Bdynamic" "-l" "util" "-l" "util" "-l" "dl" "-l" "rt" "-l" "pthread" "-l" "pthread" "-l" "gcc_s" "-l" "c" "-l" "m" "-l" "rt" "-l" "pthread" "-l" "util" "-l" "util"
      = note: /home/me/repos/rust_book/sysinfo_error/target/debug/deps/libsysinfo_error-ad346d9cb3d265cb.rlib(sysinfo_error-ad346d9cb3d265cb.sysinfo_error15.rcgu.o): In function `sysinfo_error::read_sysinfo':
              /home/me/repos/rust_book/sysinfo_error/src/lib.rs:11: undefined reference to `_$LT$sysinfo..linux..system..System$u20$as$u20$sysinfo..traits..SystemExt$GT$::new::h2ef0fda9b3bb905d'
              collect2: error: ld returned 1 exit status
    
    
    error: aborting due to previous error
    
    thread 'rustc' panicked at 'Box<Any>', /checkout/src/librustc_errors/lib.rs:504:8
    note: Run with `RUST_BACKTRACE=1` for a backtrace.
    thread 'rustc' panicked at 'couldn't compile the test', /checkout/src/librustdoc/test.rs:288:12
    
    
    failures:
        src/lib.rs - read_sysinfo (line 7)
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
    
    error: test failed, to rerun pass '--doc'
    

    特质 SystemExt 缺少。我试着在doctest中导入板条箱,如下所示

    /// Test
    ///
    /// ```
    /// extern crate sysinfo;
    /// use sysinfo::SystemExt;
    /// assert_eq!(16317367, sysinfo_error::read_sysinfo());
    /// ```
    pub fn read_sysinfo() {
        ...
    }
    

    但这并没有解决问题,因为仍然没有找到板条箱:

    ---- src/lib.rs - read_sysinfo (line 8) stdout ----
            error[E0432]: unresolved import `sysinfo`
     --> src/lib.rs:4:5
      |
    4 | use sysinfo::SystemExt;
      |     ^^^^^^^ Maybe a missing `extern crate sysinfo;`?
    [...]
    

    有没有办法在医生测试期间从板条箱中导入性状?

    1 回复  |  直到 7 年前
        1
  •  1
  •   m00am    7 年前

    如中所述 this issue ,rustdoc将所有测试包装在 fn main() {... } 包装器。您可以通过显式定义一个main函数来避免这种情况。要执行此操作,请添加 # 到应该位于主测试代码“外部”的行。对于问题中的示例,解决方案如下所示:

    /// Test
    /// ```
    /// # extern crate sysinfo;
    /// # extern crate sysinfo_error;  // The name of my crate
    /// # fn main() {
    ///     assert_eq!(16317367, sysinfo_error::read_sysinfo());
    /// # }
    /// ```
    pub fn read_sysinfo() {
        ...
    }
    
    推荐文章