如何在MIDJE中定义先决条件的功能



我应该开始说我是新手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来致电并返回(do-turns)来进行测试。对于记录,do-turns是一个假设的先决条件函数,我将从尚未尚不到的模块中获得 - 据我了解,这是自上而下的TDD工作方式。

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

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

我尝试了其他几种使CLOJURE识别do-turns的方法,但是unfinished语句似乎正在给它问题。我只是使用unfinished错误吗?

来自Midje文档:

unfinished与Clojure的declare相似,因为它可以进行多个参数并为每个参数定义一个VAR。与声明不同,它将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)返回。

最新更新