一种链接测试的方法,一个在clojure中一个接一个地运行?

时间:2016-03-23 20:27:40

标签: unit-testing clojure leiningen clojure.test

Lein test以随机顺序运行我的函数。

我有两个修改相同数据的函数。我需要先运行第一个,然后运行第二个。我的测试中的顺序

示例:

;;===============my file=============
;;this fails if x and y are not found.
(defn create-data [x y]
  (go add x y))

;;if the update function doesn't find x and y it adds them so create-data fails when it runs after update-data
(defn update-data [x y]
  (go update x y))

;;======my file test=======
(deftest create-test
  (testing "this should run first"
   (is (= 20 create-data)))

(deftest create-test
  (testing "this should run second"
   (is (= 20 update-data)))

所以我认为为这两个函数创建一个测试将使它工作,但它没有。

(deftest test-create-update.
  (testing "this should run second"
    (is (= 20 create-data))
    (is (= 20 update-data)))

我想要一些能够同时运行两个函数的东西,但是首先会运行create-data,无论结果如何(无论是通过还是失败)都将运行update-data。在我的测试中我需要两个。他们个人工作。但我需要自动化测试。

2 个答案:

答案 0 :(得分:2)

您可以使用测试夹具来创建和拆除测试环境。这可以针对所有测试或每次单独测试完成。

请参阅use-fixtures

; Here we register my-test-fixture to be called once, wrapping ALL tests 
; in the namespace
(use-fixtures :once my-test-fixture)

如果要对多个名称空间强制执行订单,可以将它们包装在my-test-fixture中。

答案 1 :(得分:0)

您为两种功能创建一个测试的直觉是一种很好的方法。您遇到的问题很可能与测试无关。

您发布的代码(go add x y)建议您使用core.async。有一些问题:

  1. go blocks返回一个频道,其中的代码“稍后”执行,所以除非你阻止结果,否则你无法保证发生任何事情。
  2. (go add x y)不执行任何功能,只返回y。您可能想要(!< (go (add x y)))
  3. 除非add通过原子或ref或类似物修改某个状态,否则什么都不会改变。
  4. 我认为真正的问题在于代码,而不是测试。或者,如果代码“有效”,那么这是因为您的测试中没有阻塞。您能否详细说明goadd在您的背景下的内容?