Question

J'ai un projet mis en place avec technè appelé Leiningen. J'ai créé un module appelé gommage avec un type en elle appelé Scrub et une fonction appelée foo.

technè / scrub.clj:

(ns techne.scrub)
  (deftype Scrub [state]
    Object
     (toString [this]
     (str "SCRUB: " state)))

(defn foo
  [item]
  (Scrub. "foo")
  "bar")

technè / scrub_test.clj:

(ns techne.scrub-test                                                                                                                                             
  (:use [techne.scrub] :reload-all)                                                                                                                               
  (:use [clojure.test]))                                                                                                                                          


(deftest test-foo                                                                                                                                                 
  (is (= "bar" (foo "foo"))))                                                                                                                                                           

(deftest test-scrub                                                                                                                                               
  (is (= (Scrub. :a) (Scrub. :a)))) 

Quand je lance le test, je reçois l'erreur:

Exception in thread "main" java.lang.IllegalArgumentException: Unable to resolve    classname: Scrub (scrub_test.clj:11)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5376)
    at clojure.lang.Compiler.analyze(Compiler.java:5190)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)

Si tout test de gommage I remove fonctionne très bien. Pourquoi: l'utilisation techne.scrub « importation » les définitions de fonction, mais pas les définitions de type? Comment puis-je faire référence aux définitions de type?

Était-ce utile?

La solution

Parce que DEFTYPE génère une classe, vous aurez probablement besoin d'importer cette classe Java dans techne.scrub-test avec (: import [techne.scrub Scrub]) dans votre définition ns.

En fait, j'écrit cette même chose en ce qui concerne defrecord ici:

Une autre chose que vous pourriez faire serait de définir une fonction constructeur dans les broussailles:

(defn new-scrub [state] 
  (Scrub. state))

et alors vous ne devez importer Scrub dans le test-gommage.

Autres conseils

J'ajoute l'importation, mais obtenir le même problème. Je teste avec les attentes empaqueter 2.0.9, en essayant de DEFTYPE d'importation INode nœud et de l'interface.

En core.clj:

(ns linked-list.core)

(definterface INode
  (getCar [])
  (getCdr [])
  (setCar [x])
  (setCdr [x]))

(deftype Node [^:volatile-mutable car ^:volatile-mutable cdr]
  INode
  (getCar[_] car)
  (getCdr[_] cdr)
  (setCar[_ x] (set! car x) _)
  (setCdr[_ x] (set! cdr x) _))

En core_test.clj:

(ns linked-list.core-test
  (:require [expectations :refer :all]
            [linked-list.core :refer :all])
  (:import [linked-list.core INode]
           [linked-list.core Node]))

et la sortie de lein autoexpect:

*************** Running tests ***************
Error refreshing environment: java.lang.ClassNotFoundException: linked-list.core.INode, compiling:(linked_list/core_test.clj:1:1)
Tests completed at 07:29:36.252

La suggestion d'utiliser une méthode de fabrication, cependant, est un travail autour viable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top