Ruby on rails 此规范和控制器代码有什么问题?

Ruby on rails 此规范和控制器代码有什么问题?,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我正在尝试用rspec测试一个现有的rails项目。我想测试一个控制器,但得到一个我无法解决的错误:S 这是我的规格代码 require 'spec_helper' describe BriefNotesController do before(:all) do @customer=Factory(:customer) @project=Factory(:project_started, :owner => @customer) end context '

我正在尝试用rspec测试一个现有的rails项目。我想测试一个控制器,但得到一个我无法解决的错误:S

这是我的规格代码

require 'spec_helper'

describe BriefNotesController do

  before(:all) do
    @customer=Factory(:customer)
    @project=Factory(:project_started, :owner => @customer)
  end

  context 'get :new' do

    it 'should redirect to login page for not signed in users' do
      get :new, :project_id => @project.id
      response.should redirect_to("/kullanici-girisi")
    end

    it 'should be success and render new brief note page for project owner' do
      sign_in @customer
      get :new, :project_id => @project.id
      response.should be_success
    end

  end

end
这是我的控制器代码

class BriefNotesController < ApplicationController
  before_filter :authenticate_user!
  before_filter :find_project

  def new
    @brief_note = @project.brief_notes.new
  end

  def create
    @brief_note = @project.brief_notes.build(params[:brief_note])
    if @brief_note.save
      redirect_to brief_project_path(@project)
    else
      render :action => :new
    end
  end

private
  def find_project
    @project = current_user.projects.find_by_cached_slug([params[:project_id]])
  end
end
class-BriefNotesController:新建
结束
结束
私有的
def find_项目
@project=当前用户.projects.find\u by\u cached\u slug([params[:project\u id]])
结束
结束
我认为当前的\u user.projects.find\u by\u cached\u slug方法不起作用。这就是错误所在

Failures:

  1) BriefNotesController get :new should be success and render new brief note page for         project owner
 Failure/Error: get :new, :project_id => @project.id
 NoMethodError:
   undefined method `brief_notes' for nil:NilClass
 # ./app/controllers/brief_notes_controller.rb:6:in `new'
 # ./spec/controllers/brief_notes_controller_spec.rb:19:in `block (3 levels) in <top (required)>'
故障:
1) 简要说明控制器get:new应该成功,并为项目所有者呈现新的简要说明页面
失败/错误:get:new,:project\u id=>@project.id
命名错误:
nil:NilClass的未定义方法“简要注释”
#./app/controllers/brief_notes_controller.rb:6:in'new'
#./spec/controllers/brief_notes_controller_spec.rb:19:in `分块(3级)in'

错误来自您的
find_项目
过滤器:
find_by_cached_slug
返回一个nil,它被分配给
@project
,在
new
操作中调用
简短注释
时触发未定义的方法错误

根据您的规范描述,我假设它甚至不应该执行
新的
代码,而是在
验证用户中重定向?我自己不使用Desive(这是一种Desive方法,对吗?),所以我不确定该方法的具体细节,但我认为这就是你的问题所在


我不认为问题出在您的FactoryGirl语法上,该语法已被弃用,但仍然可以使用。

如果没有关于您的模型的更多信息,我不能肯定,但一个可能的罪魁祸首是您将@project.id作为请求参数传递,但您是通过cached_slug进行查找的。请尝试@project.to_param。

您使用的是FactoryGirl的旧版本吗?组:test do gem'shoulda'gem'rspec rails',“~>2.11.0”gem'factory\u girl\u rails'gem'webrat',0.7.1'end,因此没有版本声明我认为语法错误。但我不明白这会如何导致您的错误。我相信应该是
FactoryGirl.create(:customer)
而不是
Factory(:customer)
。但我不确定,也许它只是不推荐使用的代码,还不是无效的代码。而且,我也不知道
find\u by\u cached\u slug
从何而来,这个方法是由gem提供的吗?顺便说一句,很抱歉收到垃圾邮件…请验证用户!如果用户是客户,请不要重定向他。这很公平——我不是在评判你,只是为你的测试建议了一个可能的解决方案!如果不清楚,我的意思是您应该将
get:new,:project\u id=>@project.id
更改为
get:new,:project\u id=>@project.to\u param
非常感谢:)对于我的问题,您的建议完全正确:)