私は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
[])
これまでのところとても良いです。私はテストを実行すると、失敗します:
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 docsから
ありがとうございます。私の唯一の懸念は、 'do-turns'を別の名前空間に入れると、' start-game'が存在する名前空間とdo-turnsがある名前空間の両方をテストモジュールにインポートする必要があるということです'生きる? OOPでは、テスト対象のクラスを対応するテストディレクトリにインポートするだけで、依存関係を模擬することができます。そのパターンはClojureでは不可能ですか? –
'do-turns'と' start-game'が異なる名前空間にある場合、両方の名前空間をインポートするか、 'clojure-ttt.other-namespace/do-turns'のような完全修飾名を与える必要があります。 '提供される'は['with-redefs'](https://clojuredocs.org/clojure.core/with-redefs)を利用し、それを上書きするにはvarにアクセスする必要があります。抽象化に依存したい場合は、プロトコルを使用できます。 –