我应该说我是新来的Clojure开始,FP一般。我一直在阅读有关如何在Midje定义先决条件的文件,但我不能做一些它的意义。如何定义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
[])
到目前为止好。我进行的测试,他们失败的原因:
一)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
错了吗?
谢谢,这是有效的。我唯一担心的是,如果我将'do-turns'放入不同的命名空间,这是否意味着我将不得不将导入到我的测试模块中的'start-game'所在的命名空间和'do-turns'命名空间“生活?在OOP中,我只着重于将被测试的类导入相应的测试目录,并嘲笑依赖关系。这种模式在Clojure中是不可能的吗? –
是的,如果'do-turns'和'start-game'在不同的命名空间中,则需要导入这两个命名空间或给出完全限定的名称,如'clojure-ttt.other-namespace/do-turns'。 'provided'使用['with-redefs'](https://clojuredocs.org/clojure.core/with-redefs),你需要访问var来覆盖它。如果你想依赖抽象,你可以使用协议。 –