capybara undefined方法`标签?'为零:NilClass

时间:2012-09-18 16:41:17

标签: ruby-on-rails capybara bdd

当我试图告诉Capybara visit ('/')时,我有以下失败的测试。

1) Credits when user is non-enabled show user credits available at the top.
   Failure/Error: visit ('/')
   NoMethodError:
     undefined method `tag?' for nil:NilClass
   # ./app/controllers/application_controller.rb:16:in `set_current_tag'
   # ./spec/requests/credits_spec.rb:12:in `block (3 levels) in <top (required)>'

ApplicationController中的代码如下所示

def set_current_site
  current_host = request.host
  @site = Site.where(domain: current_host).first 
  @site = Site.where(domain: 'mysiste.com').first unless @site.present?
end

def set_current_tag
  if @site.tag? && Dvd.tagged_with(@site.tag, wild: true, any: true).any?
    @site.tag = @site.tag
  elsif params[:tag] && Dvd.tagged_with(params[:tag], wild: true, any: true).any?
    @site.tag = params[:tag]
  else
    @site.tag = ''
  end
end

我在这方面有点迷失,如何解决这个问题以及什么是理想的解决方案。我是否应该将实例变量的设计更改为方法并使用FactoryGirl for Site?

Site模型非常简单。

class Site < ActiveRecord::Base
  attr_accessible :domain, :content, :program, :tag, :locale, :parent, :title, :landing

  validates_presence_of :domain
  validates_uniqueness_of :domain

end

工厂是

FactoryGirl.define do
  factory :site do
    domain    "dvdstore.com"
    title     "DVD Store" 
    program   "premium"
    content   "movies"
  end
end

1 个答案:

答案 0 :(得分:1)

尝试添加到credits_spec.rb:

before do
  @site = FactoryGirl.create(:site)
  @request.host = @site.domain
end

默认情况下,请求主机为“www.example.com”,猜测您没有此域的站点记录。

未找到网站的回退(@site = Site.where(domain: 'mysiste.com').first unless @site.present?)可能也不起作用:

  1. 它依赖于域“mysiste.com”的db条目,但默认情况下每个测试都以空DB开头。你创建了这样的条目吗?
  2. 域名中可能存在拼写错误:mysiste.com而不是mysite.com
  3. 因此,当您运行规范时,@ site不是fount而不是设置。