在演示者规范中使用ActionView :: TestCase :: Behavior和view方法

时间:2013-05-08 00:05:25

标签: ruby-on-rails mongodb rspec presenter viewcontext

使用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那是在做魔术。)

2 个答案:

答案 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 }

https://www.ruby-forum.com/topic/2922913#1029887