rspec期望redirect_to失败

时间:2014-04-02 08:16:20

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

有时新的(非常干)rspec语法让我发疯...

Rspec v 2.14.1

describe "POST create" do
  subject { post :create, contractor: valid_params }

  context "by user" do
    before { sign_in @legal.user }

    it "contractor successful created" do
      expect { subject }.to redirect_to(contractor_path(assigns(:contractor).id))

我有错误&问题在这里:

 NoMethodError: # :contractor variable not defined
   undefined method `id' for nil:NilClass

似乎expect在执行控制器方法post之前接受一个运算符,因为我试图提出这个方法。

我的代码:

def create
  @contractor = Contractor.restrict!(current_accreditation).new(permitted_params) # TODO move to the IR::Base
  if @contractor.save
    current_accreditation = @contractor.create_legal!(user: current_user) # TODO legal create
    redirect_to(@contractor)
  else
    render(:new)
  end
end

其次,为什么我在尝试

时出错
expect(subject).to ...

为什么{}有效,但()没有?在津津有味的文档中,这种方法效果很好:https://www.relishapp.com/rspec/rspec-rails/docs/matchers/redirect-to-matcher

1 个答案:

答案 0 :(得分:3)

有点无关,但我发现以下内容很有用:

  • 如果要在块中的任何内容之前/之后进行测试,请使用expect {}。例如。 expect { subject } to change(User, :count) - 您想在之前检查计数,然后检查计算差异,看看它是否真的发生了变化。

  • 使用expect ()来验证块的结果,例如。发生了重定向,或者已经分配了某些内容,等等。

使用assigns(:contractor)的测试不起作用,因为您使用的是{}符号 - 因此它正在尝试在评估主题之前和之后计算出assigns(:contractor).id(和当然,在主题之前,它不存在)。