2016-06-22 18 views
1

我有一个我想测试的函数。为什么我无法使用-ref提取到单独的函数?

(defn -main 
    [& args] 
    (let [port (Integer/parseInt (or (first args) "8080"))] 
    (run-jetty 
     app 
     {:port port}))) 

我需要模拟的原因很明显走run-jetty,所以我用with-redefs验证正确的ARG游戏通过。这很好。

(it "should overide the port with first arg" 
     (with-redefs [run-jetty (fn [handler opts] [handler opts])] 
      (should= 8081 (jetty-port (underTest/-main "8081"))))) 

我想,因为我在一个多试验几次用它来提取with-redefs电话,所以我想这:

(defn mock-jetty 
    [test] 
    (with-redefs [run-jetty (fn [handler args] [handler args])] test)) 

(describe "The app" 
    (it "should default to port 8080" 
     (mock-jetty 
     (should= 8080 (jetty-port (underTest/-main)))))) 

此测试调用真正run-jetty功能,并启动服务器。为什么会发生?

编辑

更改提取到宏:

(defmacro mock-jetty 
    [someTest] 
    `(with-redefs [run-jetty (fn [handler args] [handler args])] ~someTest)) 

(describe "The app" 
    (it "should default to port 8080" 
     (mock-jetty 
     (should= 8080 (jetty-port (underTest/-main)))))) 

抛出此异常: Can't use qualified name as parameter: boost-bin.handler-test/handler

回答

2

我可以猜到,它是与事实with-redefs是一个宏连。所以当你直接用代码调用它时,它会在redefs的上下文中执行test正文,而当你将它移出到函数时,正文(should= 8080 (jetty-port (underTest/-main)))在被传递给宏之前正在执行(因为它总是碰到函数的参数)

要使其工作,你可以重写mock-jetty宏:

(defmacro mock-jetty 
    [test] 
    `(with-redefs [run-jetty (fn [handler# args#] [handler# args#])] ~test)) 

我敢肯定,这将有助于

+0

这将引发异常'了java.lang.RuntimeException:无法使用合格名称作为参数:boost-bin.handler-test/handler'。我是否需要引用函数params? – ZeroDivide

+0

你能展示一个宏调用的例子吗? – leetwinski

+0

当然,我在上面添加了一个修改。 – ZeroDivide

相关问题