在Padrino(Sinatra)中具有RSPEC的测试助手



我正在尝试在Padrino(Sinatra)应用程序中测试一个助手。我的帮助方法本身是调用Padrino Core Helper方法,但它们不确定。该错误仅出现在RSPEC中,而应用程序正常运行。因此,我在RSPEC中包括我的助手的方式使其松散" Padrino Scope" ,但我不知道如何在我的RSPEC环境中正确带Padrino Helper的范围。

我的助手:

module AdminHelper
  Sort = Struct.new(:column, :order)
  def sort_link(model, column)
    order = sorted_by_this?(column) ? 'desc' : 'asc'
    link_to mat(model, column), url(:pages, :index, sort: column, order: order)
  end
  def sorted_by_this?(column)
    column.to_s == @sort.column && @sort.order == 'asc'
  end
end
Lenstroy::Admin.helpers AdminHelper

我的规格:

describe AdminHelper do
  before(:all) do
    class AdminHelperClass
      include AdminHelper
    end
  end
  subject(:helper) { AdminHelperClass.new }
  describe '#sort_link' do
    context "with :pages and :title parameters" do
      before do
        sort = AdminHelperClass::Sort.new('title', 'asc')
        helper.instance_variable_set('@sort', sort)
      end
      subject { helper.sort_link(:pages, :title) }
      it { should match(/<a href=([^ ]+)pages/) }
    end
  end
end

导致错误:

1) AdminHelper#sort_link with :pages and :title parameters 
     Failure/Error: subject { helper.sort_link(:pages, :title) }
     NoMethodError:
       undefined method `mat' for #<AdminHelperClass:0x007f1d951dc4a0>

包括定义mat的助手不起作用,因为一种方法取决于另一个助手,并且它继续进行...

更新
在我的规格助手中,我有:

def app(app = nil, &blk)
  @app ||= block_given? ? app.instance_eval(&blk) : app
  @app ||= Lenstroy::Admin
  @app.register Padrino::Helpers
  @app.register Padrino::Rendering
  @app
end

在我的规格中,我有:

it "returns link to resource with sort parameters" do
  app do
    get '/' do
      sort_link(:pages, :title)
    end
  end
  get "/"
  last_response.body.should =~ /<a href=([^ >]+)pages/
end

现在测试失败,last_response.body''

方法#mat在Padrino::Admin::Helpers::ViewHelpers中定义。你可以做

class AdminHelperClass
  include Padrino::Admin::Helpers::ViewHelpers
  include AdminHelper
end

更新:

如果您的方法确实取决于所有这些路线和帮助者,则应考虑对您的应用进行全部模型:

def mock_app(base=Padrino::Application, &block)
  @app = Sinatra.new(base, &block)
  @app.register Padrino::Helpers
  @app.register Padrino::Rendering
  # register other things
end
def app
  Rack::Lint.new(@app)
end
mock_app do
  get '/' do
    sort_link(my_model, my_column)
  end
end
get "/"
assert_equal "some test text", body

这是在padrino-admin中完成的:https://github.com/padrino/padrino-framework/blob/master/padrino-admin/padrino-admin/test/test/test_admin_application.rb

我遇到了相同的问题(并且会非常沮丧地跟踪模块并包括它们)。到目前为止,我的规格正常:

1)明确定义我的模块(如在RSPEC中使用Padrino Helper方法中所述)

module MyHelper
  ...
end
MyApp::App.helpers MyHelper

2)自动包括我规格顶部的助手。(现在我只有一个助手规格,但是将来我可能会尝试将其移至spec_helper.rb。)

describe MyHelper do
  let(:helpers) { Class.new }
  before { MyApp::App.included_modules.each { |m| helpers.extend m } }
  subject { helpers }
  it 'blah' do
    expect(subject.helper_method).to eq 'foo'
  end
end

最新更新