2016-04-06 7 views
1

diesen Code Gegeben:Lauftestmodul als Haupthaken

#lang racket/base 

(module+ test 
    (require rackunit rackunit/text-ui) 

    (provide suite) 

    (define suite 
    (test-suite 
    "test tests" 

    (test-equal? "test string test" 
        "string" 
        "string"))) 

    (run-tests suite)) 

;(require 'test) 
;(suite) 

Wenn die letzten beiden Zeilen kommentiert werden links und die Datei ausgeführt wird mit raco test test.rkt, wird der Ausgang

raco test: (submod "test.rkt" test) 
1 success(es) 0 failure(s) 0 error(s) 1 test(s) run 
0 
1 test passed 

Welche erwartet wird.

Wie kann ich die Datei ihre Tests ausführen, wenn es nur als Skript ausgeführt wird, nicht von raco?

Ich dachte, die zwei Zeilen am Ende kommentiert tun würde, was ich will: das Submodul importieren und dann die Funktion aufrufen,

(require 'test) 
(suite) 

sondern ich:

$ racket test.rkt 
require: unknown module 
    module name: #<resolved-module-path:'test> 
    context...: 
    standard-module-name-resolver 

Learn Racket in Y Minutes scheint sagen, dass 'test als 'symbol ist für Submodule, aber vielleicht nicht.

Antwort

2

Submodule mit module+ und module* erklärt ist für require in ihnen enthalten Modul nicht verfügbar, da sie auf ihrem enthaltenden Modul verlassen können, und Zyklen in der grafischen Darstellung Modulabhängigkeits sind nicht erlaubt. (Im Gegensatz dazu erklärte Submodule mit module kann nicht auf ihrem enthalten Modul abhängen, aber sie enthalten Modul kann sie require.)

Versuchen Sie, einen main Submodul Zugabe; das sollte Lauf bekommen, wenn die Datei als Skript ausgeführt wird:

(module+ main 
    (require (submod ".." test)) 
    (run-tests suite)) 

BTW, die Racket-Konvention ist für die test Submodul die Tests ausgeführt werden, nicht nur um sie zu definieren. Das Hinzufügen eines main Submoduls könnte dazu führen, dass raco test für das Skript nicht mehr funktioniert. Die Lösung wäre, den (run-tests suite) Anruf stattdessen an das test Submodul zu verschieben.

+0

Von Python kommend, wo nichts vor irgendjemandem versteckt ist, enttäuscht mich dieser erste Absatz. Abgesehen davon bin ich auch an das Python-Idiom 'if __name__ ==" __main__ ": unittest.main()' gewöhnt, und deshalb möchte ich, dass die Tests ausgeführt werden, wenn ich den Code ausführe. Ich denke, ich werde mich verabschieden müssen. : c – cat