Rspec / Rails3:NoMethodError:nil的未定义方法`text':NilClass

时间:2013-12-12 17:29:41

标签: ruby-on-rails ruby-on-rails-3 testing rspec

我有一些测试失败了。以下是我的测试:

require 'spec_helper'

describe "Authenticaton" do

  let(:base_title){"KS > Kids | "}

  subject { page }

  describe "for non-signed-in users" do

    let(:user) { FactoryGirl.create(:user) }
    let(:subject) { FactoryGirl.create(:subject) }

    context "in the Subjects controller" do

      describe "visiting the edit page" do
        before { visit edit_subject_path(subject) }
        it { should have_title("#{base_title}Home") }
      end 

      describe "visiting the subject index" do
        before { visit subjects_path }
        it { should have_title("#{base_title}Home") } 
      end 

    end 
  end 
end

这是输出

1)对于访问主题索引的主题控制器中的非登录用户的身份验证

 Failure/Error: it { should have_title("#{base_title}#{I18n.t("messages.session.sign_in")}") }
 NoMethodError:
   undefined method `text' for nil:NilClass
 # ./spec/requests/extra_auth_pages_spec.rb:23:in `block (5 levels) in <top (required)>'

2)访问编辑页面的主题控制器中的非登录用户的身份验证

 Failure/Error: it { should have_title("#{base_title}Home") }
 NoMethodError:
   undefined method `text' for nil:NilClass
 # ./spec/requests/extra_auth_pages_spec.rb:18:in `block (5 levels) in <top (required)>'

我在这里遗漏了什么?谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

如果没有看到正在测试的代码,很难知道,但有几个可能的原因:

1)请记住,let是惰性评估的:let在规范中引用符号之前不会创建对象。对于这种情况,您可能希望在user发生之前创建visit实例,但它不会存在,因为永远不会评估user。这可能会导致身份验证失败。

2)subject是一个不幸的名称选择,因为RSpec使用subject来引用正在测试的对象实例。这可能会也可能不会引起问题。