Clojure を使用して Webdriver チェックを記述しようとしています。オブジェクト指向言語を使用していた場合、ページ オブジェクト パターンを使用します。ページをオブジェクトとしてモデル化することは理にかなっていると思います。ページ オブジェクト用の Java クラスをいくつか作成すれば、すべてうまくいきます。
同じレベルの明快さを維持する機能的なスタイルを使用して、ページ オブジェクト パターンに代わるものがあるかどうかを知りたいです。
Clojure を使用して Webdriver チェックを記述しようとしています。オブジェクト指向言語を使用していた場合、ページ オブジェクト パターンを使用します。ページをオブジェクトとしてモデル化することは理にかなっていると思います。ページ オブジェクト用の Java クラスをいくつか作成すれば、すべてうまくいきます。
同じレベルの明快さを維持する機能的なスタイルを使用して、ページ オブジェクト パターンに代わるものがあるかどうかを知りたいです。
ページ (特に RESTful なページ) は、リクエストからレンダリングまでの機能と考えることができます (次のステップに進みたい場合は、レンダリングによって一連の新しいリクエストが公開されます)。
ページへのリクエストの送信から引数への関数の適用への変換は単純であり、非常に包括的でもあります。
複雑な webapp を提供している場合は、リクエストの機能的なビューを試してみてください。GET はデータを取得できますが、サーバー側の状態を変更したり、PUT を使用してリソースを作成したり、POST を使用して変更したりしないでください。
この方法でコントローラーを作成すると、Web ドライバーなしでかなりのテストを実行できます。ほとんどの場合、コントローラーへのリクエスト入力のモックアップを提供し、レンダリングされた結果 (GET の場合) またはストレージの状態 (POST および PUT の場合) のいくつかのプロパティを確認するだけで十分です。
途中で行われるべきデータ処理のテストを簡素化するために、リクエストの解析とレンダリングを別々の関数に分割すると便利であることがわかりました。
(defn parse-home
[request]
(let [user-id (-> request :params :session :id)
account (get-user user-id)]
{:user-id user-id
:account account}))
(defn do-home
[user-id account]
(let [messages (get-messages account)
feed (generate-feed user-id)]
(update-user user-id :last-visited (java.util.Date.))
{:messages messages
:feed feed}))
(defn render-home
[request messages feed account]
(let [messages (mapv summarize (filter important messages))
feed (sort-by :priority feed)
template (-> request :page :template)]
(render template (assoc request :data {:messages messages :feed feed :account account}))))
(defn home
[request]
(let [{:keys [user-id account]} (parse-home request)
{:keys [messages feed]} (do-home user-id account)
body (render-home request messages feed account)]
{:status 200
:content-type "text/html"
:body body}))
ホームページ ロジックの各要素は、これらの関数の 1 つに適切な入力を提供し、出力のいくつかのプロパティを検証することで検証できます。フロントエンドで clojurescript も使用していない限り、状態をモックアップしたり、ページの相互作用をシミュレートしたりする必要はありません (その場合でも、確認したいロジックをブラウザーのインターフェースから抽象化して、リプレイ テストの必要性を回避できます)。 )。