1

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

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

4

1 回答 1

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,否则无需模拟状态或模拟页面交互(即使在这种情况下,您要验证的逻辑也可以从浏览器的接口中抽象出来,以避免需要重放测试)。

于 2013-10-22T16:47:29.760 回答