2

我应该首先说我是 Clojure 的新手,一般来说是 FP。我一直在阅读有关如何在 Midje 中定义先决条件的文档,但我无法理解其中的一些内容。

我的理解是,要进行自上而下的 TDD,您应该首先在您的测试模块中编写一个测试,并unfinished在顶部有一条语句“声明”您尚未定义的所有先决条件函数。然后,您可以在测试中的函数中摆弄那些必备函数provided(描述它们的返回值等)。

我的困惑在于您应该如何让您的实际源模块识别先决条件功能。这是一个非常简单且人为的示例,我将用它来说明我的意思:

    ;;; in my run_game_test module

    (ns clojure-ttt.run-game-test
      (:require [midje.sweet :refer :all]
                [clojure-ttt.run-game :refer [start-game]]))

    (unfinished do-turns)

    (fact "`start-game` returns whatever `do-turns` returns"
      (start-game) => ..winner..
      (provided
        (do-turns) => ..winner..))

run_game然后为了使测试正确失败,我只是在我的模块中编写了一个函数的存根。

    (ns clojure-ttt.run-game)

    (defn start-game
      [])

到目前为止,一切都很好。我运行测试,但它们失败了,因为:
a)do-turns没有被调用
b)start-game没有返回任何东西。

因此,现在通过更改start-game为 call 和 return使测试通过(do-turns)。作为记录,do-turns我将从一个尚不存在的模块中获得一个假设的先决条件函数——据我所知,这就是自顶向下 TDD 的工作方式。

    (defn start-game
      []
      (do-turns))

现在,可以理解的是,我遇到了一个巨大的错误;Clojure 无法解析符号do-turns。所以我想,也许如果我(declare do-turns)在顶部,我可以防止它爆炸。不,我得到一个不同的错误,因为我试图调用一个未绑定的函数。

我尝试了其他几种让 Clojure 识别的方法,do-turns但似乎该unfinished声明给它带来了问题。我只是用unfinished错了吗?

4

1 回答 1

1

来自Midje 文档

unfinished与 Clojure 的相似之处declare在于它可以接受多个参数并为每个参数定义一个 var。与 declare 不同,它将 var 绑定到一个如果被调用就会爆炸的函数

因此,当您这样做(unfinished do-turns)然后调用它时(do-turns)会引发异常:

错误#'do-turns[var] 没有实现,但它是这样调用的: (do-turns)midje.util.exceptions/user-error (exceptions.clj:13)

您可以通过移除(unfinished do-turns)部件并提供do-turns. 例如,

(ns clojure-ttt.run-game)

(defn do-turns)
  [])

(defn start-game
  []
  (do-turns))

并在你的测试中引用它

(ns clojure-ttt.run-game-test
  (:require [midje.sweet :refer :all]
            [clojure-ttt.run-game :refer [start-game do-turns]])) ; <- do-turns

;; Remove `(unfinished do-turns)` since it is no longer unfinished

(fact "`start-game` returns whatever `do-turns` returns"
  (start-game) => ..winner..
  (provided
   (do-turns) => ..winner..)) 
;; => returns true

请注意,当您提供 , 的实现时do-turns(unfinished do-turns)将抛出异常,因为实现已经存在,因此将其删除。

现在您已经展示了对(start-game)返回什么的调用返回(do-turns)。

于 2017-09-15T18:33:37.347 回答