有时新的(非常干)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
答案 0 :(得分:3)
有点无关,但我发现以下内容很有用:
如果要在块中的任何内容之前/之后进行测试,请使用expect {}
。例如。 expect { subject } to change(User, :count)
- 您想在之前检查计数,然后检查计算差异,看看它是否真的发生了变化。
使用expect ()
来验证块的结果,例如。发生了重定向,或者已经分配了某些内容,等等。
使用assigns(:contractor)
的测试不起作用,因为您使用的是{}
符号 - 因此它正在尝试在评估主题之前和之后计算出assigns(:contractor).id
(和当然,在主题之前,它不存在)。