使用Railscast示例,我为我的演示者编写了一个包含ActionView::TestCase::Behavior
的规范,并将view
方法传递给演示者。
spec/spec_helper.rb
:
...
config.include ActionView::TestCase::Behavior, :example_group => {:file_path => %r{spec/presenters}}
...
spec/presenters/order_presenter_spec.rb
:
require 'spec_helper'
describe OrderPresenter do
describe "#subtotal" do
subject { OrderPresenter.new(order, view).subtotal }
let(:order) { stub(:order, working_subtotal: 4500) }
it "renders the subtotal table row" do
should == "<tr><th>SUBTOTAL</th><td>$45.00</td></tr>"
end
end
end
然而,这给了我两个错误。 第一个是
/Users/shevaun/.rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_controller/test_case.rb:12:in `block in <module:TemplateAssertions>': undefined method `setup' for #<Class:0x007fe2343b2f40> (NoMethodError)
所以我以与ActiveSupport::Testing::SetupAndTeardown
相同的方式添加了ActionView::TestCase::Behavior
。
修正了我的错误:
NoMethodError:
undefined method `view_context' for nil:NilClass
致电view
时。这是由@controller
ActionView::TestCase
内的nil
实例变量引起的。{/ 1}。
我正在使用Rails 3.2.13和rspec-rails 2.13.0,并使用正常工作的相同版本的另一个应用程序。
我能想到的唯一可能有所不同的是,这个应用程序正在使用MongoDB,所以ActiveRecord应用程序可能包含免费设置@controller
的内容吗?
我有一个使得演示者规范通过的解决方法,但我想知道@controller
通常如何实例化,以及是否有更优雅的方式为MongoDB项目执行此操作(如果它是ActiveRecord那是在做魔术。)
答案 0 :(得分:4)
我目前的解决方案是通过在演示者规范之前调用@controller
来实例化setup_with_controller
实例变量。
spec_helper.rb
:
RSpec.configure do |config|
config.include ActiveSupport::Testing::SetupAndTeardown, :example_group => {:file_path => %r{spec/presenters}}
config.include ActionView::TestCase::Behavior, :example_group => {:file_path => %r{spec/presenters}}
config.before(:each, example_group: {:file_path => %r{spec/presenters}}) do
setup_with_controller # this is necessary because otherwise @controller is nil, but why?
end
...
end
答案 1 :(得分:1)
您还可以创建自己的视图:
let(:view) { ActionController::Base.new.view_context }
subject { OrderPresenter.new(order, view).subtotal }