Clojure和Page Object Pattern替代品

时间:2013-10-22 15:57:46

标签: clojure webdriver pageobjects

我正在尝试使用Clojure编写Webdriver检查。如果我使用面向对象的语言,我会使用页面对象模式。我认为将页面建模为对象是有道理的,我可以为页面对象创建一些java类,一切都会很好。

我想知道是否有使用保持相同清晰度的功能样式的页面对象模式的替代品。

1 个答案:

答案 0 :(得分:2)

页面(特别是RESTful)可以被认为是从请求到渲染的函数(如果你想进行下一步,渲染会暴露一些新的请求)。

从发送请求到页面到将函数应用到参数的转换很简单,而且非常全面。

如果您要提供复杂的Web应用程序,请尝试查看请求的功能视图。 GET可以检索数据,但不应修改服务器端状态,使用PUT创建资源,使用POST进行变异。

一旦以这种方式编写控制器,就可以在没有webdrivers的情况下进行相当多的测试。它应该足以提供对控制器的请求输入的模型,并验证渲染结果(对于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}))

主页逻辑的每个元素都可以通过使用正确的输入提供这些函数之一来验证,并验证输出的某些属性。除非您还在前端使用clojurescript,否则无需模拟状态或模拟页面交互(即使在这种情况下,您要验证的逻辑也可以从浏览器的界面中抽象出来,以避免重放测试的需要)。