testing - 在 midje 中模拟函数调用

标签 testing clojure stubbing redefinition midje

假设我有一个函数

(defn extenal_api_fn [stuff]
   ... do things....
)

(defn register_user [stuff]
  (external_api_fn stuff))

然后是测试

(def stuff1
  {:user_id 123 })

(def stuff2
  {:user_id 234})

(background (external_api_fn stuff1) => true
            (with-redefs [external_api_fn (fn [data] (println "mocked function"))]
            (register_user stuff1) => true)
            (register_user stuff2) => true)

(facts "stuff goes here"
  (fact "user that registers correctly
    (= 1 1) => truthy)
  (fact "user that has a registration failure"
    (= 1 2) => falsy))

这失败了

"you never said #'external_api_fn" would be called with these arguments:
    contents of stuff1

为了模拟内部事务失败,什么是对该函数调用进行 stub (仅在某些情况下)的好方法。

最佳答案

您可以使用 Midje 的提供的:

(fact
  (register_user stuff1) => :registered
  (provided
    (extenal_api_fn stuff1) => :registered))

(fact
  (register_user stuff2) => :error
  (provided
    (external_api_fn stuff2) => :error))

您还可以通过使用 anything 代替函数参数来 stub 函数以返回一个值,无论输入参数如何:

(fact
  (register_user stuff2) => :error
  (provided
    (external_api_fn anything) => :error))

关于testing - 在 midje 中模拟函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40046759/

相关文章:

testing - Powershell 用于 web-ui 测试的优势?

android - 使用测试支持库销毁并重启 Activity

recursion - 在 Clojure 中将结果累积到向量中的最佳方法? (纯功能代码看起来丑陋和冗长)

uri - Wiremock 中的多值查询字符串

rest - 如何使用stubby4j stub 某些请求并为其他请求调用真实服务

testing - 无法在 VSTS 中创建新的测试计划

javascript - 如何使用 AVA 框架根据某些条件(比如环境变量)跳过测试执行

Clojure pedestal.io 代码未在 IntelliJ 中解析

docker 上带有 nREPL 的 Vim Fireplace 将无法运行测试

Ruby 与法拉第 stub ,无法让它工作