gpt4 book ai didi

testing - clojure 是否需要依赖注入(inject)来使代码更易于测试?

转载 作者:行者123 更新时间:2023-11-28 19:40:58 24 4
gpt4 key购买 nike

我记得读过一篇文章,说 Ruby 并不真正需要 DI 或 DI 框架,因为类是开放的。因此,您可以简单地重写依赖项的构造函数,使其返回一个假对象。

我对 Clojure 和函数式编程还很陌生。我想知道 Clojure 是否需要依赖注入(inject)或者它可以出于类似/其他原因放弃它。这是一个具体的示例(请随意指出我的设计如何不符合 Clojure 的惯用方式):

Imagine you're developing a web crawler/spider. It needs to traverse a webpage you've downloaded. This is an action with side-effects. The webpage could change on every query, your internet connection could cut out, etc. It finds all the links on the webpage, visits each one, and then traverses it in the same way.

现在,您想编写一个模拟 http 客户端的测试,以便它返回一个硬编码的字符串响应。如何在测试中调用程序的 -main 并阻止它使用 真实 http 客户端?

最佳答案

clojure.core 中的 with-redefs 宏对于移除函数非常有用。

这里有一个简短的 REPL session 来演示这一点:

user=> (defn crawl [url]
#_=> ;; would now make http connection and download content
#_=> "data from the cloud")
#'user/crawl
user=> (defn -main [& args]
#_=> (crawl "http://www.google.com"))
#'user/-main
user=> (-main)
"data from the cloud"
user=> (with-redefs [crawl (fn [url] "fake data")]
#_=> (-main))
"fake data"

由于 Clojure 程序(主要)由函数而非对象组成,因此函数的动态重新绑定(bind)取代了 DI 框架为测试目的所做的大量工作。

关于testing - clojure 是否需要依赖注入(inject)来使代码更易于测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15696574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com