2015-11-18 24 views
1

这个问题不是关于特定的库(尽管其中一些将用于最终),但更多关于如何构建应用程序代码以使副作用函数单元测试成为可能。如果我们应该这样做呢?如何在Clojure中对副作用函数进行单元测试?

显然,测试纯副作用自由函数,通过输入和声明输出是明确和简单的。

有2种(非常粗略的)类型的测试,单元和集成。让我们关注单元测试。因此,如果您有从文件中读取或写入文件的功能(例如使用slurp/spit),或者使用数据库,环形应用程序或core.async通道,那么如何进行单元测试Clojure中有这样的事情吗?嘲笑是否涉及,如果是的话,他们应该如何定义?是否有binding,with-{redefs, redefs-fn, local-vars}参与?我应该定义defprotocol以在单元测试期间实现(又称模拟)实现吗?

测试的价值之一(主要价值?)是强制应用程序代码更好的设计,所以也许在Clojure中的测试是特殊的,你必须以特定的方式构造应用程序代码在Clojure中进行副作用函数单元测试可能吗?

或者我完全错过了这一点? P.S.1:我很喜欢Clojure中/小型应用程序的工作和开发(当然还有一段路要走),尽管测试部分对我来说还不完全清楚。 P.2:另一个重大话题是在Clojure中进行集成测试,但它应该得到一个单独的SO问题。

+0

介绍[midje](https://github.com/marick/Midje) – Davyzhu

回答

1

一般来说,您测试带有副作用的代码将为您的测试实施设置和拆卸工件。这些将创建基本/初始状态并帮助评估结果。

+0

一个例子是一个很好的补充。你知道GitHub上的任何特定的东西吗? – akazlou

1

我强烈建议您尽可能避免with-redefs和朋友。我们使用协议来处理大多数与外部服务和依赖注入相关的所有交互操作,因此测试变得轻而易举。当然,我们仍然尝试尽可能地做出纯粹的功能,并且仔细地管理效果,但是通常我们在需要时对协议感到满意。

相关问题