Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 rspec测试协会_Ruby On Rails 3_Rspec2 - Fatal编程技术网

Ruby on rails 3 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

我想在我的rspec控制器测试中测试一名员工是否与一家公司有关联

最后,我想在员工控制员的
创建
操作中总结一下:

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