тесты внутри вызовов функций или для операторов в clojure не работает - PullRequest
3 голосов
/ 31 января 2020

Я написал код, который выглядит примерно так

(testing "check that for all these roles there's an alert"
    (binding [*profile* account-exceeded-limits]
      (let [overview-page (overview-container sample-form
                                              :role readonly-no-download)]
        (is (dommy/has-class?
             (-> overview-page (sel1 [:div#export-list-panel :.panel-body
                                      :.alert]))
             "alert-warning")))
      (let [overview-page (overview-container sample-form
                                              :role dataentry)]
        (is (dommy/has-class?
             (-> overview-page (sel1 [:div#export-list-panel :.panel-body
                                      :.alert]))
             "alert-warning")))
      (let [overview-page (overview-container sample-form
                                              :role editor)]
        (is (dommy/has-class?
             (-> overview-page (sel1 [:div#export-list-panel :.panel-body
                                      :.alert]))
             "alert-warning")))
      (let [overview-page (overview-container sample-form
                                              :role member)]
        (is (dommy/has-class?
             (-> overview-page (sel1 [:div#export-list-panel :.panel-body
                                      :.alert]))
             "alert-warning")))
      (let [overview-page (overview-container sample-form
                                              :role collaborator)]
        (is (dommy/has-class?
             (-> overview-page (sel1 [:div#export-list-panel :.panel-body
                                      :.alert]))
             "alert-warning")))
      (let [overview-page (overview-container sample-form
                                              :role readonly)]
        (is (dommy/has-class?
             (-> overview-page (sel1 [:div#export-list-panel :.panel-body
                                      :.alert]))
             "alert-warning")))))

Мне нужно реорганизовать этот код, чтобы сделать его более сухим.

Итак, я попробовал это

(testing "check that for all these roles theres an alert"
    (for [role [dataentry readonly-no-download editor member collaborator
             readonly]]
      (let [overview-page (overview-container sample-form
                                              :role role)]
        (is (dommy/has-class?
             (-> overview-page (sel1 [:div#export-list-panel :.panel-body
                                      :.alert]))
             "alert-warning")))))

Казалось, что тесты не были проведены.

Я также попробовал это:

(testing "check that for all these roles theres an alert"
(map (fn [role]  (let [overview-page (overview-container sample-form
                                              :role role)]
        (is (dommy/has-class?
             (-> overview-page (sel1 [:div#export-list-panel :.panel-body
                                      :.alert]))
             "alert-warning"))) [dataentry readonly-no-download editor member collaborator
             readonly])))

еще раз, казалось, что тесты не были проведены.

Что может быть причиной этого ? Есть ли способ, которым я могу сделать эту тестовую сушилку? я должен пытаться сделать тесты сушилки?

Ответы [ 2 ]

5 голосов
/ 31 января 2020

Хотя причина, по которой ваш код не работает, уже устранена, я бы хотел указать are

(are argv expr & args)

Checks multiple assertions with a template expression.
See clojure.template/do-template for an explanation of
templates.
 Example: (are [x y] (= x y)  
              2 (+ 1 1)
              4 (* 2 2))
Expands to: 
         (do (is (= 2 (+ 1 1)))
             (is (= 4 (* 2 2))))
 Note: This breaks some reporting features, such as line numbers.

Что бы разрешить что-то вроде:

(testing "check that for all these roles there's an alert"
  (are [role] 
       (let [overview-page (overview-container sample-form :role role)]
         (dommy/has-class?
           (-> overview-page (sel1 [:div#export-list-panel :.panel-body :.alert]))
           "alert-warning"))
       dataentry 
       readonly-no-download 
       editor 
       member 
       collaborator 
       readonly))
4 голосов
/ 31 января 2020

В Clojure функции for и map являются ленивыми и не будут работать, пока вы не сделаете что-то с выводом.

Поскольку вы не заботитесь о выводе, вам следует

Обязательно добавьте в закладки Clojure CheatSheet * * * * * * * * * * * * * * * * * * * * * * * * *1007* * * * * * * * * * * * * * * * * * * * * * * * * * *. и всегда держите его открытым на вкладке браузера!

Здесь также перечислены многие другие замечательные ресурсы .


Приложение :

Очень полезный двоюродный брат map - mapv. Это не что иное, как (vec (map ...)), которое приводит к выводу map в (не ленивый) вектор. Я использовал Clojure довольно долго, прежде чем впервые услышал об этом.

Аналогичным образом можно получить не ленивую версию for, используя (vec (for ...)). Он запускается сразу как doseq, но также возвращает последовательность результатов (вместо просто nil). Вы можете увидеть подробнее здесь .

...