简体   繁体   中英

mocking a function call in midje

Say I have a function

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

(defn register_user [stuff]
  (external_api_fn stuff))

And then a test

(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))

This fails with

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

What would be a good way to stub this function call (in only some cases) in order to simulate an internal transaction failure.

You could use Midje's provided :

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

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

You can also stub a function to return a value no matter input parameters by using anything in place of the function argument:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM