Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何对惰性进行单元测试_Unit Testing_Clojure_Lazy Sequences - Fatal编程技术网

Unit testing 如何对惰性进行单元测试

Unit testing 如何对惰性进行单元测试,unit-testing,clojure,lazy-sequences,Unit Testing,Clojure,Lazy Sequences,我有一个函数,它应该接受一个惰性seq并返回一个未实现的惰性seq。现在我想写一个单元测试(在testis btw中),以确保结果是一个未实现的延迟序列 在测试用例中使用具有副作用的函数(例如,写入ref)作为序列生成器函数。如果副作用从未发生,这意味着序列仍然没有实现。。。一旦序列被实现,函数将被调用 首先,设置如下: (def effect-count (ref 0)) (defn test-fn [x] (do (dosync (alter effect-coun

我有一个函数,它应该接受一个惰性seq并返回一个未实现的惰性seq。现在我想写一个单元测试(在testis btw中),以确保结果是一个未实现的延迟序列

在测试用例中使用具有副作用的函数(例如,写入ref)作为序列生成器函数。如果副作用从未发生,这意味着序列仍然没有实现。。。一旦序列被实现,函数将被调用

首先,设置如下:

(def effect-count (ref 0))

(defn test-fn [x]
    (do
        (dosync (alter effect-count inc))
        x))
然后,运行您的函数。我只使用地图,这里:

(def result (map test-fn (range 1 10)))
测试fn是否曾经运行过:

(if (= 0 @effect-count) 
    (println "Test passed!")
    (println "Test failed!"))
因为我们知道map是懒惰的,所以它应该一直在这一点上工作。现在,序列的力评估:

(dorun result)
并再次检查效果计数的值。这一次,我们确实预计副作用已经触发。而且,它是如此

user=>@effect-count
9
如果你有很多东西要测试,也许这可以简化它:

(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开始,还有
已实现?
函数:“如果为承诺、延迟、未来或延迟序列生成值,则返回true。”

给我们函数的代码如何。给我们一根骨头。也许他指的是失业办公室前的队伍?陷阱汤姆hi帽子“未实现的懒惰序列”,我的生活故事。我有很多不同的功能,我想用这个测试。我真的在寻找一个assert is lazy宏来测试isI,我在寻找一种方法来测试任何函数,而不是一个函数到测试,看起来它不起作用。“iterate”返回一个lazy seq,但是(实例?clojure.lang.LazySeq(iterate inc 10))=>False我仍在学习clojure,但这不意味着这种方法不是通用的吗?所以,可能有很多不同的惰性实现,对吗?因此,看起来另一个答案(检查副作用)更普遍。但是如果我遗漏了什么,请告诉我。是的,你是对的。现在还有更好的方法来回答这个问题;
realized?
功能(在1.3中添加)将处理所有未决事项。值得注意的是(已实现?(迭代inc 10))=>true。我推测将其称为惰性序列是有效的,但必须实现第一个元素,因为它是作为参数传递的,因此无法避免这种情况。我认为测试返回类型符合问题的目标,并且比替代方法更具侵入性。如果可以使用函数,那么在这里使用宏有什么意义?不会
(defn是lazy[x](is(instance?clojure.lang.LazySeq x))
是否以同样的方式工作?@bfontaine是的,函数运行良好。编写测试时,您通常希望失败结果清楚地显示出错误所在。函数参数经过计算,因此失败报告将打印传入的值,而不是传入的表单。而宏保留原始表单,因此失败报告更清晰一些。例如
(是惰性的?(vec(map inc(range 10)))
,因为宏将报告
预期的:(clojure.core/instance?clojure.lang.LazySeq(vec(map inc(range 10)))
,但函数将显示
[1 2 3 4 5 6 7 8 9 10]
。这只是一个偏好问题。
(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