Как сделать тестовый каталог?

Я хотел бы создать базовый проект hello world. Модульные тесты должны находиться в каталоге test/, как описано в книге. Мой код пока выглядит следующим образом.

src/main.rs

pub mod player;

fn main() {
    println!("Hello, world!");
}

src/player.rs

pub fn rep(arg: i32) -> i32 {
    arg
}

tests/player.rs

extern crate player;

#[test]
fn it_works() {
    assert_eq!(4, player::rep(2+2));
}

Cargo.toml

[package]
name = "myapp"
version = "0.1.0"
authors = ["My Name <[email protected]>"]

Я считаю, что код очень похож на книгу. Однако cargo test терпит неудачу:

tests/player.rs:1:1: 1:21 error: can't find crate for `player`
tests/player.rs:1 extern crate player;
              ^~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

В чем проблема? Я полностью потерян.


person petrbel    schedule 01.08.2015    source источник
comment
Возможно, вы захотите добавить содержимое вашего файла Cargo.toml; это определяет название вещей, что, вероятно, и является вашей проблемой.   -  person DK.    schedule 01.08.2015
comment
@ДК. пожалуйста, взгляните на мою правку с Cargo.toml. Спасибо   -  person petrbel    schedule 01.08.2015


Ответы (2)


Есть две проблемы. Прежде всего, вы создаете исполняемый файл, а не библиотеку, поэтому вы не можете связать результат, чтобы проверить его. Во-вторых, вы, похоже, не понимаете разницы между модулями и крейтами. Вы можете прочитать главу Crates and Modules книги Rust.

Если вы хотите, чтобы типы и методы из вашего ящика были доступны извне, вам необходимо скомпилировать свой код в библиотеку. Часто исполняемые файлы в Rust будут просто тонкими оболочками вокруг одноименной библиотеки. Итак, у вас может быть:

// src/main.rs
extern crate player;

fn main() {
    println!("rep(42): {:?}", player::rep(42));
}

// src/lib.rs
pub fn rep(arg: i32) -> i32 { arg }

This would allow you to test player::rep.

Другая вещь, которую вы можете сделать, это просто написать тест рядом с кодом, который он тестирует.

// src/lib.rs
pub fn rep(arg: i32) -> i32 { arg }

#[test]
fn test_rep() { assert_eq!(rep(4), 4); }
person DK.    schedule 01.08.2015

Вы компилируете бинарник вместо библиотеки (крейта). Попробуйте переименовать «main.rs» в «lib.rs».

person Zarathustra30    schedule 01.08.2015
comment
о, но я намерен сделать бинарный файл, результатом этого проекта должен быть исполняемый файл... - person petrbel; 01.08.2015
comment
Каталоги тестов используются для тестирования функциональных API библиотек. Поскольку у двоичных файлов их нет, в этом случае нет смысла использовать тестовые каталоги. Вы хотите использовать внутренние тестовые модули для тестирования двоичных файлов. - person Zarathustra30; 01.08.2015