سؤال

لدي مشروع تم إعداده مع Lininingen يسمى Techne. لقد قمت بإنشاء وحدة نمطية تسمى Scrub مع نوع فيها يسمى Scrub ودالة تسمى Foo.

Techne/Scrub.clj:

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

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

Techne/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)))) 

عندما أقوم بإجراء الاختبار ، أحصل على الخطأ:

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)

إذا قمت بإزالة اختبار الاختبار ، فكل شيء يعمل بشكل جيد. لماذا: استخدام Techne.Scrub "استيراد" تعريفات الوظائف ولكن ليس تعريفات النوع؟ كيف يمكنني الإشارة إلى تعريفات النوع؟

هل كانت مفيدة؟

المحلول

لان deftype يولد فصلًا ، ربما ستحتاج إلى استيراد فئة Java في Techne.scrub-test مع (: استيراد [Scrub Scrub]) في تعريف NS الخاص بك.

لقد كتبت في الواقع هذا الشيء نفسه فيما يتعلق بتحرير المسجل هنا:

شيء آخر يمكن أن تفعله هو تحديد وظيفة مُنشأة في فرك:

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

وبعد ذلك لن تحتاج إلى استيراد فرك في اختبار الاختبار.

نصائح أخرى

أضيف الاستيراد ، ولكن الحصول على نفس المشكلة. أنا أختبر مع حزمة التوقعات 2.0.9 ، في محاولة لاستيراد عقدة deftype و inode الواجهة.

في 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) _))

في 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]))

والإخراج من 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

الاقتراح لاستخدام طريقة المصنع ، ومع ذلك ، هو عمل قابل للحياة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top