17

我一直遵循15 个 TDD 步骤来创建 Rails 应用程序指南 - 但遇到了一个我似乎无法解决的问题。对于 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()

我已经尝试更改测试的顺序以及许多其他事情,但我一次又一次地继续收到相同的测试失败 - Word.random() 已经被调用。

我正在运行 Rails 3.0 beta 4 和 Mocha 0.9.8。我一直在努力寻找解决问题的方法,但似乎找不到。我是 Ruby/Rails 的新手,所以对语言和框架相当陌生。

提前致谢!

4

5 回答 5

20

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

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

test_helper.rb
  ....
  #at the very bottom
  require 'mocha'
于 2010-12-07T09:53:11.230 回答
7

我遇到了同样的问题,模拟功能没有被隔离到测试中,这似乎是 Mocha 的加载顺序问题。

我在让 Mocha 与 Rails3 一起工作时遇到了一些问题。我发现了一些关于 stackoverflow 的帖子,但直到我在 agoragames.com 上找到了一篇帖子后才偶然发现解决方案

基本上,在项目的 Gemfile 中,Mocha 的要求应该如下所示:

gem 'mocha', :require => false

然后在 中test/test_helper.rb,为 mocha 添加一个 require 行:

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

class ActiveSupport::TestCase
...
...

我认为 Gemfile 中 mocha 的 require 行意味着您需要已经将 mocha 作为 gem 安装,bundler 不会为您处理它。

于 2010-12-03T17:11:28.837 回答
2

你怎么需要摩卡咖啡?你在使用捆绑器吗?听起来好像没有调用 mocha 拆解钩子?

于 2010-09-27T22:21:31.773 回答
0

此外,似乎 mocha_teardown 没有被 rails31 调用。设置的模拟永远不会被删除......(这个额外的黑客修复它)

  class ActiveSupport::TestCase
    def teardown
      super
      Mocha::Mockery.instance.teardown
      Mocha::Mockery.reset_instance    
    end
  end
于 2011-09-19T01:08:40.133 回答
0

这些解决方案对我自己不起作用,使用 Ruby 2.2.2、Rails 4.2.2、mocha 1.1.0、shouda-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已经为我做到了。

于 2015-10-10T16:41:37.627 回答