I am working on an api that has an interface and two distinct
implementations lets call them: foo and bar.

I have a testing routine with a bunch of functions that each call a
function to get a clean instance of an implementation, initializes it
with some data and then interrogate it.

with the exception of calling (new-foo) or (new-bar), foo and bar can
be tested identically.  I would like to be able to define tests in a
namespace for the api, then have a test-foo namespace that calls those
tests with *new-test-instance* bound to new-foo.  likewise for new
bar.  because I would like the exact same tests run, the whole point
is these things should behave the same at the API level.  I don't want
to have to copy and paste all my tests and make sure I keep them
synchronized, that seems like an error waiting to happen.

I can define the tests in test-api with deftest but doing so will
cause the test to be run there (when I call mvn clojure:test), and as
there is no implementation they will of course fail.  I can block test-
api from calling it's tests with:
(defn test-ns-hook [])
but then the tests become a pain to call from another namespace.

surely there is a way to do this?

in test-api with the blocking test-ns-hook, I tried
(def the-tests [
(deftest test-1 .... ) ])

then in test-foo I tried

(defn test-ns-hook []
  (dorun
   (map (fn [x]
          (binding [project.test-api/*new-test-instance*
                    (fn [] (new-foo))]
            (x)))
        project.test-api/the-tests)))

that doesn't work I keep seeing this:


Uncaught exception, not in assertion.
expected: nil
  actual: java.lang.NoClassDefFoundError: org/slf4j/impl/
StaticLoggerBinder
...

except if I put that exact same test-ns-hook implementation into the
repl and call (run-tests) everything checks out *exactly* as expected.


I have spent way too many hours on this... help?

Kevin

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to