首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Midje中的模拟协议实现

Midje中的模拟协议实现
EN

Stack Overflow用户
提问于 2013-10-28 11:30:10
回答 2查看 806关注 0票数 1

是否有任何方法使用类似于“提供”的语法来模拟(而不是存根)使用Midje (clojure)的协议函数?

这是问题的一部分:模拟屏蔽协议,但与嘲弄有关。

更详细的是:我有一个协议和一个函数来返回实现它的东西。我想对函数进行存根,以返回对协议的模拟,并对模拟的协议“实现”的功能之一表示期望。

编辑-下面是一个示例:

有一个协议,它的实现:

代码语言:javascript
复制
(defprotocol Thiny (go-bump [_ _]))
(deftype TheThing []
  Thiny
  (go-bump [_ _] 23))

有一个函数返回协议的实现:

代码语言:javascript
复制
(defn gimme [] (TheThing.))

TheThing可能是一个DB或网络连接,或者是您想要在测试中摆脱的其他一些讨厌的东西。

然后,有一个我想测试的函数:

代码语言:javascript
复制
(defn test-me [n]
  (let [t (gimme)]
    (-> t (go-bump n))))

我想确定它叫n。

这是我第一次尝试创建一个测试。但是这还只是一半,我想在gimme返回的薄纸上建立起预期。

代码语言:javascript
复制
(fact
  (test-me 42) => 42
  (provided (gimme) => (reify Thiny (go-bump [_ n] n))))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-28 16:01:57

为了子孙后代。下面是一个有效的测试:

代码语言:javascript
复制
(fact
  (test-me 42) => 42
  (provided (gimme) => :the-thingy)
  (provided (go-bump :the-thingy 42) => 42))

诀窍是使用相互绑定的多个提供的语句。

我们的观察。同样的测试方式不适用于使用其他语法在协议上调用函数的函数。不知道为什么。

代码语言:javascript
复制
(defn test-me2 [n]
  (let [t (gimme)]
     (.go-bump t n)))
票数 1
EN

Stack Overflow用户

发布于 2013-10-28 14:04:25

模拟协议应该与模拟函数没有什么不同,您需要考虑第一个驱散参数是this,因此模拟函数应该考虑这种类型。

例如,给定一个协议P

代码语言:javascript
复制
(defprotocol P 
  (foo [this]) 
  (bar-me [this] [this y]))

扩展为Integer类型

代码语言:javascript
复制
(extend-protocol P
  Integer
  (foo [this]
    (+ this 4))
  (bar-me [this]
    (* this 5))
  (bar-me [this y]
    (+ this y)))

您可以先检查几件事情,没有Long的实现

代码语言:javascript
复制
(foo 3)
=>  IllegalArgumentException No implementation of method: :foo of 
    protocol: #'P found for class: java.lang.Long  
    clojure.core/-cache-protocol-fn (core_deftype.clj:541)

ints预期的工作

代码语言:javascript
复制
(foo (int 3))
=> 7

现在,根据需要定义事实并提供协议功能:

代码语言:javascript
复制
(fact
  (foo (int 3)) => 7
  (provided (foo 3) => 8))

在这种情况下,它正确地失败了,因为模拟正在为指定的输入返回8而不是7

代码语言:javascript
复制
FAIL at (test.clj:20)
     Expected: 7
     Actual: 8

如果值模拟还不够,并且需要提供替代实现,那么看看与-redefs,您可以用它包装测试的函数。

代码语言:javascript
复制
 => (defn f [] false)
 => (println (f))
 ;; false
 => (with-redefs-fn {#'f (fn [] true)}
 #(println (f)))
 ;; true

此外,还有一些用于运行时调度模拟的在GitHub上讨论his

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19633633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档