我在clojure中构建了一个发送/接收HTTP请求的库,它是一些REST API Web服务的客户端。我怎么测试?我相信,我的测试应该发送/接收真实的请求/响应。那怎么测试呢?首先,我的意思是单元测试,然后是其他测试。
答案 0 :(得分:2)
假设您有一个带有函数的库进行转换并发送请求:
(defn make-request [url data]
(http/post url data)
(defn transform [x y z]
{:x (* x x)
:y (* y y)
:z (* z z)})
(defn f [x y z]
"""f is the library function you want to expose as the client"""
(make-request "/api/v1/foo" (transform x y z))
在编写单元测试时,您并不想实际发出http请求和响应。它们应该很快,除了代码的功能正确性之外,不依赖于任何东西。因此,依靠网络连接和您正在谈论的服务即将结束。
(with-redefs [http/post (fn [url data]
(is (= url "/api/v1/foo"))
(is (= data {:x 1 :y 4 :z 9})))]
(f 1 2 3)
我假设您没有从头开始编写自己的http库,而是使用clj-http或其他东西。如果它是一个可靠的库,我们可以在我们的测试中对它进行一些假设。
因此,上述测试中唯一缺少的是验证您是否真正调用了您希望与客户期望的数据相关的端点。
您可以通过实际使用客户端库进行调用并验证您获得的响应是否正确来证明这一点。或者,如果您有权访问目标提供者,则可以编写consumer driven contract tests。