我在将 test.check 与正常测试一起使用时遇到问题。我一整天都在尝试弄清楚发生了什么事,但我仍然不确定。 这就是我现在拥有的:
(deftest user-can-only-be-inserted-once
(;normal test))
(defspec insert-one-user-should-let-me-retrieve-that-one-user
gen-quantity
(prop/for-all ; test.check test))
现在,只要我在测试文件中每次更改后从控制台执行“lein test”,它就会按预期工作。但是,从草书 repl 运行测试或通过“lein Quickie”使用 Quickie 插件运行测试,repl 将重新加载不正确的命名空间。
效果是,每当测试失败并且我修复该测试时,它仍然会在 repl 中失败,因此看起来有些东西在那里无法正常工作。
如果有人知道如何解决这个问题,我很乐意听到。我还想听听是否有人有不同的设置,将正常测试和 test.check 结合起来,或者这根本不起作用。
谢谢, 斯文
更新 实际上,我发现问题不是 normal 和 test.check 的组合,而是我试图检查断言是否在特定情况下抛出的事实。在正常测试中,您可以使用 (is (thrown? Assertion (function...) 来执行此操作,但是当我在 test.check 中尝试此操作时,它会失败。
最佳答案
如果我正确理解您的更新,您的测试预计会引发异常。如果没有发生异常,则测试应该失败。
如果是这样,那么您需要在 defspec 中编写属性来捕获异常,将其作为值返回,并验证异常是否发生。
你可以这样做:
(defn catcher [f]
(try (f)
(catch Throwable t t)))
(defspec some-specification-name
(prop/for-all [...generator-bindings...]
(not-nil? (catcher (my-function generated-values)))))
关于unit-testing - 结合 test.check 和 Clojure 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224755/