rspec期望更改为创建的对象

时间:2014-04-03 05:45:54

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

我在控制器操作中测试current_accreditation更改。 current_accreditation类似于current_usercurrent_locale和其他类似方法。

it { expect{subject}.to change(controller.current_accreditation).from(@legal).to( assigns(:contractor).legal ) }

这是控制器代码。

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

似乎assign(:contractor)返回nil,因为它在@contractor方法开始之前需要create变量。我怎么能避免这种情况?如何传递将在其中创建的to方法值?我尝试过lambda但没有参数错误。我也试过像Accreditation.last这样的东西,但我也找不到创建的认证。

1 个答案:

答案 0 :(得分:0)

对于初学者,您没有使用https://www.relishapp.com/rspec/rspec-expectations/v/3-0/docs/built-in-matchers/change-matcher中记录的change匹配器。 change采用以下任一方式:a)块或b)对象和属性。你传递了一个论点。

在传入块的情况下,它会在前后评估块。在对象和属性的情况下,它评估对象之前和之后的属性。只有一个对象被传入,它没有什么可以评估的。

所以,具体来说,你可以使用:

it { expect{subject}.to change(controller, :current_accreditation).from(@legal).to( assigns(:contractor).legal ) }

it { expect{subject}.to change { controller.current_accreditation }.from(@legal).to( assigns(:contractor).legal ) }