我在控制器操作中测试current_accreditation
更改。 current_accreditation
类似于current_user
,current_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
这样的东西,但我也找不到创建的认证。
答案 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 ) }