rspec2:助手的假 params 和 request.headers

发布于 2024-10-17 06:49:58 字数 1739 浏览 6 评论 0原文

我有一个 Rails 3 助手,它根据 params 和 request.headers 返回代码。我试图嘲笑他们,但没有成功。我最近的尝试:

require 'spec_helper'

describe ApplicationHelper, "#banner" do
  before do
    @b728 = Factory :banner, :code => '<div style="width: 728px">:(clickref)</div>', :width => 728, :height => 90
    @b160 = Factory :banner, :code => '<div style="width: 160px">:(clickref)</div>', :width => 160, :height => 600

    Factory :ad_sense_channel, :key => "country", :value => nil, :ad_sense_id => 1
    Factory :ad_sense_channel, :key => "country", :value => "de", :ad_sense_id => 2
    # More ad_sense_channel factories here...
  end

  it "should return b728 for 728x90, left position and DictionariesController, German language and a guest and a German IP" do
    helper.stub(:params) { {:controller => "dictionaries", :action => "index"} }

    helper.stub(:request) do
      request = double('request')
      request.stub(:headers) { {"Accept-Language" => "de-DE, kr"} }
      request
    end

    @detected_location = DetectedLocation.new("193.99.144.80")
    banner(728, 90, "left").should eq('<div style="width: 728px">11+2+21+31+41</div>')
  end
end

我仍然提出了一个例外:

NameError:
       undefined local variable or method `params' for #
     # ./app/helpers/application_helper.rb:7:in `banner'

解决方案:感谢 zetetic,我的规范现在如下所示:


controller.params = {:controller => "dictionaries", :action => "index"}
controller.request.stub(:headers) { {"Accept-Language" => "de-DE, kr"} }

@detected_location = DetectedLocation.new("193.99.144.80")
helper.banner(728, 90, "left").should eq('11+2+21+31+41')

I've got an Rails 3 helper, which returns code depending on the params and request.headers. I've tried to mock them, but didn't succeed. My latest try:

require 'spec_helper'

describe ApplicationHelper, "#banner" do
  before do
    @b728 = Factory :banner, :code => '<div style="width: 728px">:(clickref)</div>', :width => 728, :height => 90
    @b160 = Factory :banner, :code => '<div style="width: 160px">:(clickref)</div>', :width => 160, :height => 600

    Factory :ad_sense_channel, :key => "country", :value => nil, :ad_sense_id => 1
    Factory :ad_sense_channel, :key => "country", :value => "de", :ad_sense_id => 2
    # More ad_sense_channel factories here...
  end

  it "should return b728 for 728x90, left position and DictionariesController, German language and a guest and a German IP" do
    helper.stub(:params) { {:controller => "dictionaries", :action => "index"} }

    helper.stub(:request) do
      request = double('request')
      request.stub(:headers) { {"Accept-Language" => "de-DE, kr"} }
      request
    end

    @detected_location = DetectedLocation.new("193.99.144.80")
    banner(728, 90, "left").should eq('<div style="width: 728px">11+2+21+31+41</div>')
  end
end

I still raises an exception:

NameError:
       undefined local variable or method `params' for #
     # ./app/helpers/application_helper.rb:7:in `banner'

Solution: Thanks to zetetic, my spec now reads like this:


controller.params = {:controller => "dictionaries", :action => "index"}
controller.request.stub(:headers) { {"Accept-Language" => "de-DE, kr"} }

@detected_location = DetectedLocation.new("193.99.144.80")
helper.banner(728, 90, "left").should eq('11+2+21+31+41')

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

榆西 2024-10-24 06:49:58

尝试将 banner 更改为 helper.banner

您会注意到,当单独使用方法名称时,上下文是:

self.class # => RSpec::Core::ExampleGroup::Nested_1

但是当从 helper 调用时,它是:

self.class # => ActionView::Base

helper 在 RSpec::Rails::HelperExampleGroup 中定义,并执行以下操作:

# Returns an instance of ActionView::Base with the helper being specified
# mixed in, along with any of the built-in rails helpers.
def helper
  _view.tap do |v|
    v.extend(ApplicationHelper) if defined?(ApplicationHelper)
    v.assign(view_assigns)
  end
end

Try changing banner to helper.banner

You'll note that when using the method name by itself the context is:

self.class # => RSpec::Core::ExampleGroup::Nested_1

But when calling from helper it's:

self.class # => ActionView::Base

helper is defined in RSpec::Rails::HelperExampleGroup and does this:

# Returns an instance of ActionView::Base with the helper being specified
# mixed in, along with any of the built-in rails helpers.
def helper
  _view.tap do |v|
    v.extend(ApplicationHelper) if defined?(ApplicationHelper)
    v.assign(view_assigns)
  end
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文