我一直在关注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()
我已经尝试过更改测试顺序以及其他许多内容,但是我一次又一次地继续接收相同的测试失败 - 已经调用了Word.random()。
我正在运行Rails 3.0 beta 4和Mocha 0.9.8。我一直在努力寻找解决问题的方法,但我似乎无法找到它。我是Ruby / Rails的新手,所以我对语言和框架并不熟悉。
提前致谢!
答案 0 :(得分:20)
#Gemfile
group :test
gem 'mocha', '~>0.9.8', :require => false
...
end
和
test_helper.rb
....
#at the very bottom
require 'mocha'
答案 1 :(得分:7)
我有同样的问题,模拟功能没有被隔离到测试,它似乎是摩卡的加载顺序的问题。
我有一些问题让Mocha与Rails3一起使用。我发现了一些stackoverflow帖子,但直到我在agoragames.com上发现帖子后才发现该解决方案
基本上,在项目的Gemfile中,Mocha的需求应如下所示:
gem 'mocha', :require => false
然后在test/test_helper.rb
中,为mocha添加一个需求行:
...
...
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'mocha'
class ActiveSupport::TestCase
...
...
我认为Gemfile中mocha的需求行意味着您需要已经将mocha作为gem安装,Bundler将不会为您处理它。
答案 2 :(得分:2)
你是如何要求摩卡的?你在使用捆绑器吗?听起来好像没有调用摩卡拆机挂钩?
答案 3 :(得分:0)
此外,似乎没有使用rails31调用mocha_teardown。设置的模拟永远不会被删除...(这个额外的黑客修复它)
class ActiveSupport::TestCase
def teardown
super
Mocha::Mockery.instance.teardown
Mocha::Mockery.reset_instance
end
end
答案 4 :(得分:0)
这些解决方案本身并不适用于我,使用Ruby 2.2.2,Rails 4.2.2,mocha 1.1.0,shoulda-context 1.2.1,factory_girl_rails 4.5.0以及一些测试相关的宝石。
还在test_helper.rb
底部移动这两行是什么
require 'mocha/setup'
require 'mocha/test_unit'
我也删除了require 'test/unit'
。似乎mocha/test_unit
已经为我做了这件事。