Search code examples
unit-testingclojure

Clojure: How To use-fixtures in Testing


I am writing some unit tests that interact with a database. For this reason it is useful to have a setup and a teardown method in my unit test to create and then drop the table. However there are no docs :O on the use-fixtures method.

Here is what i need to do:

 (setup-tests)
 (run-tests)
 (teardown-tests)

I am not interested currently in running a setup and teardown before and after each test, but once before a group of tests and once after. How do you do this?


Solution

  • You can't use use-fixtures to provide setup and teardown code for freely defined groups of tests, but you can use :once to provide setup and teardown code for each namespace:

    ;; my/test/config.clj
    (ns my.test.config)
    
    (defn wrap-setup
      [f]
      (println "wrapping setup")
      ;; note that you generally want to run teardown-tests in a try ...
      ;; finally construct, but this is just an example
      (setup-test)
      (f)
      (teardown-test))    
    
    
    ;; my/package_test.clj
    (ns my.package-test
      (:use clojure.test
            my.test.config))
    
    (use-fixtures :once wrap-setup) ; wrap-setup around the whole namespace of tests. 
                                    ; use :each to wrap around each individual test 
                                    ; in this package.
    
    (testing ... )
    

    This approach forces some coupling between setup and teardown code and the packages the tests are in, but generally that's not a huge problem. You can always do your own manual wrapping in testing sections, see for example the bottom half of this blog post.