2013-04-05 19 views
0

我正在使用Ruby on Rails中的项目。我们有一个控制器动作,它使用一个gem中的模块。这个宝石还没有完成,它不在文件系统上。在没有必需的模块文件的情况下测试ruby类

我被告知模拟模块以测试控制器。有没有办法测试这个没有真正的宝石?嘲笑'要求'的电话工作? 我们目前正在使用Mocha进行嘲弄和剔除。

有一种方法可以模拟Python中的导入。也许有类似的回答来嘲笑红宝石中的需求。 How to mock an import

或者请让我知道什么是处理这个问题的最佳方法。

更新:告诉我嘲笑它的人,建议添加一个存根文件,但这需要向控制器添加测试代码,我不想这样做。

更新2:控制器使用模块中声明的方法。

+1

如果有人告诉你嘲笑它,而你不知道如何,为什么不问那个人该怎么做呢? – 2013-04-05 17:40:22

+0

我问那个人。他建议添加一个存根文件,但我需要在控制器中要求它,并且我不想用测试代码破坏控制器。 – ieldanr 2013-04-05 17:52:56

+0

控制器实际上是否需要模块中的任何功能?如果没有,请在加载控制器之前将其定义为空模块,或者在加载rails环境之前测试整个堆栈。 – 2013-04-05 18:10:01

回答

0

如果您正在编写测试以模拟方法调用,则它们将失败。例如,

controller.should_receive(:method_in_non_existent_module).with(args) #=> errors 

在正确红 - >绿色TDD方案中,这是正常的,因为下一个步骤将是所需要的宝石/文件,包括该模块并在控制器添加方法调用,使测试通过。但是你不能通过测试,因为你不能要求文件,因为它还不存在。

可能是开发人员要求您不是在测试中,而是在您的实际代码中模拟这种方法。例如,他正在撰写一款宝石“加密狗 - 笑话”,其中有一种方法可以从最近的技术会议中获得最受欢迎的加密狗玩笑。他不希望这个gem成为你阻止你完成控制器和视图的拦截器,所以他会要求你使用一个虚拟接口来发出一个虚拟响应。

  1. 写失败
  2. 测试添加文件lib/dongle-jokes.rb
  3. 以下内容添加到该文件。

    module DongleJokes 
        def joke 
        "Dongle jokes aren't funny!" 
        end 
    end 
    
  4. 要求文件并包含模块,使用控制器中的方法。

该测试现在应该通过。当你开始使用真正的宝石时,你可以删除lib/dongle-jokes.rb

+0

即使在StackOverflow答案中,我们是否真的需要调出PyCon的东西? – Russell 2013-04-05 19:50:43

+0

@Russell我们不需要,如果你能把它看作只是一个例子来解释答案:) – Emil 2013-04-05 20:15:45

+0

这个答案也是正确的。这实际上是我的同事所建议的。我最终做了类似的事情:在测试目录中存根文件,在测试中需要存根文件,并在测试中模拟方法。这允许我在没有实际模块的情况下在控制器中编写代码(: – ieldanr 2013-04-05 20:30:37

0

如果你在Rails中工作,那么无论如何你都不需要向控制器添加一个require,因为当你将gem添加到你的gem文件时,它将在Rails启动时自动被需要。

你的同事最可能的意思是你应该保留模块本身。您是否在使用rspec进行测试?如果是这样,你应该可以使用stub_const。假设该模块被称为Payments。然后你可以编写如下的测试代码:

before do 
    stub_const("Payments", stub) 
    Payments.stub(process: "payments successful") 
end 
+0

你的回答看起来是正确的! 'm寻找:'stub the module istelf'。不幸的是,我们没有使用rspec。你知道Minitest和Mocha怎么做? – ieldanr 2013-04-05 20:24:47

相关问题