2010-06-25 73 views
16

我一直在关注15 TDD steps to create a Rails application指南 - 但遇到了一个问题,我似乎无法解决。对于WordsController的功能测试,我有以下代码:摩卡模拟进行另一个测试

class WordsControllerTest < ActionController::TestCase 

    test "should get learn" do 
    get 'learn' 
    assert_response :success 
    end 

    test "learn passes a random word" do  
    some_word = Word.new 
    Word.expects(:random).returns(some_word) 
    get 'learn' 
    assert_equal some_word, assigns('word') 
    end 
end 

在我有以下代码Word类:

class Word < ActiveRecord::Base 
    def self.random 
    all = Word.find :all 
    all[rand(all.size)] 
    end 
end 

当我运行测试,我遇到以下错误(缩短了简洁):

1) Failure: unexpected invocation: Word(...).random() satisfied expectations: 
- expected exactly once, already invoked once: Word(...).random() 

我试图改变改变与其他千头万绪沿测试的顺序,但一次次我不断地收到相同的工商业污水附加费t失败 - 即Word.random()已被调用。

我正在运行Rails 3.0 beta 4和Mocha 0.9.8。我已经搜寻了很长时间,很难找到解决方案,但我似乎无法找到它。我是Ruby/Rails的新手,所以对语言和框架不熟悉。

在此先感谢!

回答

7

我有同样的问题,嘲笑的功能不是孤立的测试,它似乎是与摩卡的加载顺序问题。

我有一些问题让摩卡能够使用Rails3。我就发现了几个计算器的职位,而且在整个解决方案并没有绊倒,直到我发现了agoragames.com后

基本上,在你的项目的Gemfile中,需要摩卡应该是这样的:

gem 'mocha', :require => false 

然后在test/test_helper.rb,添加需要行摩卡:

... 
... 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require 'mocha' 

class ActiveSupport::TestCase 
... 
... 

我认为需要在Gemfile中摩卡线意味着你需要已经安装摩卡作为宝石,捆绑不会照顾它适合你。

2

你是如何要求摩卡咖啡的?你在使用捆绑器吗?这听起来有点像摩卡拆解挂钩没有被调用?

+0

是否应该在测试之间调用拆解? – pushmatrix 2010-10-26 00:59:57

+1

如果'Mocha'已经正确加载,它将有猴子修补测试框架来调用'Mocha :: API#mocha_verify'&'Mocha :: API#mocha_teardown',即你不需要显式地调用它们。我之所以询问'摩卡'是如何被要求的,是为了确定是否按照正确的顺序加载了东西,这样猴子补丁就能正常工作。 – 2010-10-28 10:55:41

+1

如果您在运行测试时将'MOCHA_OPTIONS = debug'设置为环境变量,您将看到哪些测试框架已成功进行猴子修补。如果您仍然遇到问题,请告诉我调试输出是什么,并告诉我您正在使用的摩卡版本。谢谢。 – 2010-12-04 17:36:48

19

摩卡需要最后加载。我也为这个问题苦苦挣扎。

#Gemfile 
    group :test 
    gem 'mocha', '~>0.9.8', :require => false 
    ... 
    end 

test_helper.rb 
    .... 
    #at the very bottom 
    require 'mocha' 
+1

正是我所需要的...... – pushmatrix 2010-12-10 01:39:14

+0

正是我所需要的。我用这个头发撕了几个小时!谢谢! :) – 2011-09-30 10:59:02

+0

+1,随着移动到捆绑商i'v搞乱秩序的摩卡加载 – 2012-01-19 11:26:18

0

此外,似乎mocha_teardown没有被调用rails31。嘲笑那些设置没有拆除......(这个额外的方法修复它)

class ActiveSupport::TestCase 
    def teardown 
     super 
     Mocha::Mockery.instance.teardown 
     Mocha::Mockery.reset_instance  
    end 
    end 
0

这些解决方案并没有为我工作,对自己,使用Ruby 2.2.2,Rails的4.2.2,摩卡1.1。 0,shoulda-context 1.2.1,factory_girl_rails 4.5.0和几个测试相关的gem。

什么做的是这两条线在我的test_helper.rb底部移动:

require 'mocha/setup' 
require 'mocha/test_unit' 

我也删除require 'test/unit'。看起来mocha/test_unit已经为我做了。