Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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 Rspec Rails:测试控制器方法';创建';采用多模型形式_Ruby On Rails_Rspec_Controller_Update Attributes - Fatal编程技术网

Ruby on rails Rspec Rails:测试控制器方法';创建';采用多模型形式

Ruby on rails Rspec Rails:测试控制器方法';创建';采用多模型形式,ruby-on-rails,rspec,controller,update-attributes,Ruby On Rails,Rspec,Controller,Update Attributes,我正在构建一个RubyonRails应用程序,其中包含了常见的各种模型、视图和控制器 我的一个控制器中的“创建”操作应该创建两个不同模型的实例。这是我的密码: def create @league = League.new(params[:league]) @user = @league.users.build(params[:user]) ... .save conditions appended ... end 因此,当您通过LeagueController通过对/leag

我正在构建一个RubyonRails应用程序,其中包含了常见的各种模型、视图和控制器

我的一个控制器中的“创建”操作应该创建两个不同模型的实例。这是我的密码:

 def create
  @league = League.new(params[:league])
  @user = @league.users.build(params[:user])
  ... .save conditions appended ...
 end
因此,当您通过LeagueController通过对/leagues的POST请求调用“create”时,您将获得League的一个新实例和User的一个新实例。我还希望新的用户实例继承新的League实例的ID,这样它就可以用作将实例链接在一起的外键。这是通过以下方式实现的:

 def create
  @league = League.new(params[:league])
  @user = @league.users.build(params[:user])
  @league_id = @league.id
  @user.update_attribute('league_id', @league_id)
  ... .save conditions appended ...
 end
用户模型已经属于联盟模型,联盟模型有很多用户

通过手动测试验证,上述代码运行良好。然而,我一辈子都不知道如何用Rspec自动化这些测试。我试图成为一个好孩子,使用测试驱动的设计,但这让我感到困惑

问题是,我不知道如何在测试中访问新创建的League和User实例的属性。我正在尝试使用以下代码执行此操作:

describe LeaguesController do
  describe 'new league and user' do
    it 'should create a new user with a league_id equal to the new leagues id'
      @league_attr = { :name => "myleague", :confirmation_code => "mycode", :id => 5}
      @user_attr = { :username => "myname", :password => "mypass"}
      post :create, :user => @user_attr, :league => @league_attr
      assigns(:league_id).should eql(5)
    end
  end
end
但是对于
:league\u id

我对编程和Rspec都是新手,所以我真的很感谢有人提供的任何帮助

你试过了吗

每当我发现类似的东西时,我发现通过Pry(或Ruby Debug)插入制动点非常方便,这样我就可以检查变量及其行为

我怀疑在
@league\u id=@league.id
@user.update\u属性('league\u id',@league\u id)
之间插入一个
绑定.pry
,可能会很好地揭示这个问题


还请注意,当您通过
@league.save
调用将@league\u id持久化时,用户将自动继承该id。(这就是
@league.users.build(..)
背后的想法-它将在持久化时正确设置所需的关系。

您无法使用
new
分配
:id
。请尝试以下操作:

 def create
   @league = League.new(params[:league])
   @league.id = params[:league][:id] if params[:league][:id]
   @user = @league.users.build(params[:user])
   @league_id = @league.id
   @user.update_attribute('league_id', @league_id)
   ... .save conditions appended ...
 end
也就是说,我想知道它是如何在浏览器中工作的


此外,最好在测试时使用或夹具将数据分配给模型。

谢谢Tigraine,我将查看Pry。我对该方法的工作方式很有信心(它的行为符合预期),但我想使用Rspec自动化测试,这样我就可以确保不会因为我的应用程序变得更复杂而破坏此功能。感谢您的响应,Wawa Loo。我认为它可以工作,因为我实际上不必分配
:id
。它会在每次创建新模型实例时自动分配。我正在阅读val已经存在的ue,并将其值分配给不同模型实例中的不同属性。实际上,新的ue不会分配
id
。必须先保存它。我认为它不起作用,因为您正在执行
@user=@league.users.build(params[:user])<代码> @ LeaGeIdID= @ Cuth.ID 行没有任何帮助。(如果你期望的话,请考虑接受答案)。好的,你的测试正在完成他们的工作。他们告诉你,你的控制器操作create有一个问题:提供一个
:id
作为参数是不好的,当保存两个关联的模型时,你应该使用另一种方法(一个事务-当然-创建用户、联盟和通行证,直到它们正确关联为止)。