как к модульному тесту на лень

В MySQL Вы могли сделать что-то как

SELECT 
    IF(ISNULL(processed_timestamp), 'NULL', 'NOT NULL') as myfield, 
    COUNT(*) 
FROM mytable 
GROUP BY myfield
9
задан APC 30 October 2009 в 21:48
поделиться

2 ответа

user=> (instance? clojure.lang.LazySeq (map + [1 2 3 4] [1 2 3 4]))
true

Если вам нужно много чего проверить, возможно, это упростит задачу:

(defmacro is-lazy? [x] `(is (instance? clojure.lang.LazySeq ~x)))

user=> (is-lazy? 1)

FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:7)
expected: (clojure.core/instance? clojure.lang.LazySeq 1)
  actual: (not (clojure.core/instance? clojure.lang.LazySeq 1))
false
user=> (is-lazy? (map + [1 2 3 4] [1 2 3 4]))
true

В Clojure 1.3 также реализована функция ? : "Возвращает истину. если значение было создано для обещания, задержки, будущего или ленивой последовательности "

9
ответ дан 4 December 2019 в 13:48
поделиться

Используйте функцию с побочным эффектом (например, запись в ссылку) в качестве функции генератора последовательности в вашем тестовом примере. Если побочный эффект никогда не возникает, это означает, что последовательность остается нереализованной ... как только последовательность реализована, функция будет вызвана.

Сначала настройте его так:

(def effect-count (ref 0))

(defn test-fn [x]
    (do
        (dosync (alter effect-count inc))
        x))

Затем запустите свою функцию. Я просто воспользуюсь картой, здесь:

(def result (map test-fn (range 1 10)))

Проверить, запускалась ли когда-либо test-fn:

(if (= 0 @effect-count) 
    (println "Test passed!")
    (println "Test failed!"))

Поскольку мы знаем, что карта ленивая, она всегда должна работать на этом этапе. Теперь выполните принудительную оценку последовательности:

(dorun result)

И снова проверьте значение счетчика эффектов. На этот раз мы ДЕЙСТВИТЕЛЬНО ожидаем появления побочного эффекта. И это так ...

user=>@effect-count
9
6
ответ дан 4 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: