Clojure和Page对象模式替代方案

Clojure和Page对象模式替代方案,clojure,webdriver,pageobjects,Clojure,Webdriver,Pageobjects,我正在尝试使用Clojure编写Webdriver检查。如果我使用的是面向对象的语言,我会使用页面对象模式。我认为将页面建模为对象是有意义的,我可以为页面对象创建一些java类,一切都会很好 我想知道是否有其他方法可以替代页面对象模式,使用保持相同清晰度的功能样式。一个页面(尤其是RESTful页面)可以被视为一个从请求到呈现的函数(如果您想进行下一步,呈现会公开一些新请求集) 从向页面发送请求到将函数应用于参数的转换非常简单,而且相当全面 如果您提供的是复杂的webapp,请尝试查看请求的功能

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

我想知道是否有其他方法可以替代页面对象模式,使用保持相同清晰度的功能样式。

一个页面(尤其是RESTful页面)可以被视为一个从请求到呈现的函数(如果您想进行下一步,呈现会公开一些新请求集)

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

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

一旦您以这种方式编写控制器,就可以在没有WebDriver的情况下进行大量测试。它应该基本上足以向控制器提供请求输入的模型,并验证呈现结果(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(即使在这种情况下,您要验证的逻辑也可以从浏览器的界面中抽象出来,以避免需要重播测试)