Ruby on rails 3 rspec测试协会
我想在我的rspec控制器测试中测试一名员工是否与一家公司有关联 最后,我想在员工控制员的Ruby on rails 3 rspec测试协会,ruby-on-rails-3,rspec2,Ruby On Rails 3,Rspec2,我想在我的rspec控制器测试中测试一名员工是否与一家公司有关联 最后,我想在员工控制员的创建操作中总结一下: staff.companies << current_company 以下测试是我尝试指定关联的测试,当我输入关联代码时失败: it "should belong to the current_company" do staff.should_receive(:companies) post :create end 如果我输入's
创建操作中总结一下:
staff.companies << current_company
以下测试是我尝试指定关联的测试,当我输入关联代码时失败:
it "should belong to the current_company" do
staff.should_receive(:companies)
post :create
end
如果我输入'staff.companys,您可以使用以下工具进行测试:
staff.should have(1).company
或者,如果员工已经有其他公司,则获取have(count+1).companys的计数和测试。如果您符合控制器规范,我将使用存根链
staff.stub_chain(:company, :<<).once.and_return(true)
staff.stub\u链(:company,:我会使用一种不同的方法,因为测试模型是否应该接收某个消息将您的测试与实现结合得太紧密了。您真的关心公司是否接收到。代码的问题是,一旦您删除了一个方法,它就不再存在于模型上了
您已经删除了“companys”方法(当您为其设置期望值时),现在它不再调用模型上的实际公司关联,而是您创建的存根…它返回nil(因为您没有为其设置返回值)
然后,当您尝试使用我的猜测将一家公司放入这个新的null方法时,您的操作中出现了错误(nil对象)。您可以从您的控制器添加您的创建操作代码吗?此测试正在调用的控制器?要克服nil对象问题并继续使用TDD,我将使用以下命令:staff.pull\u receive(:companys)。和_return([])这不就是剔除“staff.companys.once.检查以确保链被调用,如果没有,则会提出断言。因此,我认为你应该没事(除非我遗漏了什么…)。如果我没有“staff.companys”我仍然不理解你测试中的staff
,似乎没有抱怨(每个人的测试)都是指。你是说@staff
?还是有一些未显示的设置定义了staff
?还是我遗漏了一些明显的东西?我测试中的staff将只是一个使用“let(:staff){mock_model(staff)}的mock“谢谢你,伊恩,这正是我想要的。这也给了我很大的空间来重构我的代码。回答得很好。以防万一你想知道nil在哪里。”。
def create
@staff = Staff.new(params[:staff])
if @staff.save
@staff.companies << current_company
redirect_to staff_index_path, :notice => "Staff created successfully!"
else
@company = @staff.firm || current_company
flash[:alert] = "Staff failed to create"
render "new"
end
end
staff.should have(1).company
staff.stub_chain(:company, :<<).once.and_return(true)
it "should add the company to the user's list of companies" do
lambda do
post :create
end.should change(staff.companies, :count).from(0).to(1)
staff.companies.map(&:name).should include("Acme, Inc.")
end
staff.should_receive(:companies).and_return([])
@staff.companies << current_company