2016-10-28 4 views
0

Я хочу отделить свой модульный тестовый код от моего другого кода.Как использовать модули в ракетке?

Я ставлю тестовый код в один файл, а другой код в другой файл в том же каталоге:

Фактический код файла:

#lang racket 
(provide 
    ...procedure names...) 
...procedures... 

Тестовый файл кода:

#lang racket 
(require rackunit) 
(require "...filename of the actual code file...") 
...some additional procedures... 
...test suite with multiple test cases in it... 

Затем я запускаю:

raco test test-code-filename 

Однако это не работает, в первом тестовом примере при первом вызове процедуры, который не определен в файле тестового кода, он сообщает мне, что это несвязанный идентификатор.

Перед этой структурой я также попытался использовать комбинации (module и (module+ в файлах, но эта же проблема возникла.

Каким-то образом я, кажется, не понял модули правильно, прочитав документацию. Как я могу достичь этого разделения кода (разделив его в двух файлах)?

ответ

2

Хм ... все-определители не должны быть необходимы. Так, например, с

foo.rkt:

#lang racket 

(provide a) 

(define (a x) (add1 x)) 

и bar.rkt:

#lang racket 

(require rackunit 
     "foo.rkt") 

;; passing test 
(check-equal? (a 9) 10) 
;; failing test: 
(check-equal? (a 4) 6) 

... работает

raco test /tmp/bar.rkt

производит этот выход:

-------------------- 
FAILURE 
actual:  5 
expected: 6 
name:  check-equal? 
location: (#<path:/tmp/bar.rkt> 9 0 111 22) 
expression: (check-equal? (a 4) 6) 

Check failure 
-------------------- 

... поэтому я не уверен, почему ваш оригинальный пример не работал. Похоже, что что-то еще происходит.

+0

Я должен был сделать это более ясным в своем собственном ответе, что я использую только '(все-определил)', потому что я действительно написал тесты для каждой определенной процедуры. Я не хотел загромождать код в своем ответе всеми именами процедур. Конечно, я мог бы перечислить их все, но когда я сделал это без дополнительных круглых скобок, они всегда были неопределенными в моем тестовом коде. Я не уверен, почему ваш пример работает, потому что это почти то же самое, что я пытался раньше, за исключением того, что я увеличивал с помощью '(+ x 1)'. Я изменю свой код и проверю, работает ли он снова. – Zelphir

+0

Да, ваша структура кода работает. Я не знаю, что еще происходило в моем исходном коде, что вызвало эту проблему. Благодарю. – Zelphir

0

Кажется, я нашел ответ. Вместо использования:

(provide 
    a 
    b 
    c ...) 

мне нужно использовать:

(provide (all-defined-out)) 

Таким образом, есть один дополнительный набор скобок. Таким образом, в общей сложности я получил следующую структуру работы:

#lang racket 
(provide (all-defined-out)) 
...procedures... 

Тестовый код файла:

#lang racket 
(require rackunit) 
(require "...filename of the actual code file...") 
...some additional procedures... 
...test suite with multiple test cases in it... 

И потом:

raco test file-with-tests.rkt 

Works. Он по-прежнему не печатает никаких описаний в случаях сбоев, но это другой вопрос.

+0

Я не верю, что это правильно. Смотрите мой ответ ... –

Смежные вопросы