更快的测试 - 如何解耦Rails 4控制器?

时间:2013-12-06 14:34:16

标签: ruby-on-rails-3 ruby-on-rails-4 rspec-rails actioncontroller decoupling

为什么这很重要

测试从Rails框架中隔离的Ruby方法==大大缩短测试时间。

问题

如何正确地分离Rails 4控制器?

现在的事情

目前,这是我的rspec错误:

NameError:
  undefined local variable or method `response'

这是我在controller_spec测试文件中解耦和模拟ActionController的方法。这是我研究什么适用于Rails 3并解决我的实验中出现的错误消息的一个方法。我不相信这是有效的,因为我要么没有设置ActionController需要的一些属性,要么我无意中关闭了一些东西。似乎Rails 4为控制器增加了一些复杂性。

APP_ROOT = File.expand_path(File.join(File.dirname__FILE__), "..", "..", ".."))
$: << File.join(APP_ROOT, "app/controllers")

module ActionController
  class Base
    class << self
      attr_reader :before_filters
      attr_reader :skipped_before_filters
    end

    def self.before_filter(*args)
      @before_filters ||= []
      @before_filters << args
    end

    def self.skip_before_filter(*args)
      @skipped_before_filters ||= []
      @skipped_before_filters << args
    end

    def self.allow_forgery_protection=(val); end
    def self.allow_forgery_protection; end

    def self.protect_from_forgery(*args); end   
    def self.after_filter(*args); end

    def request=(val); end
    def request; end
    def params=(val); end
    def redirect_to(*args); end
    def render_template(*args); end
    def _compute_redirect_to_location(*args); end

  end
end

这些是我在开始此实验之前通过的规范测试:

describe "GET #home" do
  subject(:action) {get :home}

  it "is successful" do
    expect(action).to be_success
  end
  it "returns HTTP 200 status" do
    expect(action.status).to eq(200)
  end
  it "renders the home template" do 
    expect(action).to render_template("home")
  end

end

我的控制器操作只会渲染主视图并按预期工作:

def home
end

谢谢。

关于Rails 3中的解耦的链接:

  1. Running Rails Rspec Tests without Rails
  2. Rails 3, The Great Decoupling

0 个答案:

没有答案