3

使用 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::TestCasenil

我正在使用 Rails 3.2.13 和 rspec-rails 2.13.0 并且有另一个使用相同版本的应用程序

我唯一能想到的可能会有所不同的是,这个应用程序正在使用 MongoDB,所以 ActiveRecord 应用程序可能包含一些 @controller免费设置的东西?

我有一个使演示者规范通过的解决方法,但我想知道@controller通常如何实例化,以及是否有更优雅的方式来为 MongoDB 项目执行此操作(如果它是 ActiveRecord 正在发挥作用)。

4

2 回答 2

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
于 2013-05-08T00:10:47.853 回答
2

您还可以创建自己的视图:

let(:view) { ActionController::Base.new.view_context }
subject { OrderPresenter.new(order, view).subtotal }

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

于 2015-12-01T18:33:22.150 回答