Ruby on rails 测试对象是否由当前用户拥有或创建

Ruby on rails 测试对象是否由当前用户拥有或创建,ruby-on-rails,rspec,Ruby On Rails,Rspec,我目前正试图从一个教程中制作一个dropbox风格的应用程序,但我在想如何测试这个控制器时遇到了困难 这是AssetController页面 def index @assets = current_user.assets end def show @assets = current_user.assets.find(params[:id]) 此外,资产属于:user,并且用户拥有多个:资产 我该如何将其应用到rspec测试中?你到底有什么问

我目前正试图从一个教程中制作一个dropbox风格的应用程序,但我在想如何测试这个控制器时遇到了困难

这是AssetController页面

    def index
       @assets = current_user.assets
    end

    def show
       @assets = current_user.assets.find(params[:id])
此外,资产属于:user,并且用户拥有多个:资产


我该如何将其应用到rspec测试中?

你到底有什么问题?如何设置关系的基本测试或如何测试当前用户的管理

这方面的基本测试应该在模型规范中,因为这是模型的工作来整理这些东西

我通常会这样测试:

   users(:users_a).assets.should have(3).records
   users(:users_a).assets.should include(assets(:asset_a_a))
   users(:users_a).assets.should include(assets(:assets_a_b))
   users(:users_a).assets.should include(assets(:assets_a_c))
before(:each) do
  activate_authlogic
  UserSession.create(users(:user_a))
end
1) 为两个用户和一些资产(本例中为三个)定义设备(或者交替使用类似FactoryGirl的东西)。用户a的资产命名为资产a*,用户b的资产命名为资产b*)

2) 测试简单如下:

   users(:users_a).assets.should have(3).records
   users(:users_a).assets.should include(assets(:asset_a_a))
   users(:users_a).assets.should include(assets(:assets_a_b))
   users(:users_a).assets.should include(assets(:assets_a_c))
before(:each) do
  activate_authlogic
  UserSession.create(users(:user_a))
end
你可以像这样微调这个 用户(:users_a).assets.find(assets(:assets_a_a).id).应包括(assets(:assets_a_a)) 用户(:users_a).assets.find(资产(:asset_a_a).id)。不应包括(资产(:asset_b_a))

如果您完全愿意,可以对控制器部件使用类似的测试

尽管对于这些基本功能是否需要测试存在很多讨论,因为处理模型中定义的关联主要是Rails的核心功能

就我个人而言,我做这种测试是有原因的。在许多情况下,这种与许可相关的关联很快变得更加复杂,无论如何都需要详细的测试。或者有人可能会更改关联的参数并破坏某些内容

II-关于控制器内的当前用户部件

当然,这取决于您首先如何处理身份验证。如果您使用类似AuthLogic(或其他)的插件,它可能有一些方法允许在rspec中模拟登录。对于authlogic,您可以执行以下操作:

   users(:users_a).assets.should have(3).records
   users(:users_a).assets.should include(assets(:asset_a_a))
   users(:users_a).assets.should include(assets(:assets_a_b))
   users(:users_a).assets.should include(assets(:assets_a_c))
before(:each) do
  activate_authlogic
  UserSession.create(users(:user_a))
end
这将激活authlogic和“登录”用户。 然后运行控制器

  get :index
  response.should be_success
  response.should render_template :index
  assigns(:assets).should # => more or less as above, check that there are the right aessets.

你到底有什么问题?如何设置关系的基本测试或如何测试当前用户的管理

这方面的基本测试应该在模型规范中,因为这是模型的工作来整理这些东西

我通常会这样测试:

   users(:users_a).assets.should have(3).records
   users(:users_a).assets.should include(assets(:asset_a_a))
   users(:users_a).assets.should include(assets(:assets_a_b))
   users(:users_a).assets.should include(assets(:assets_a_c))
before(:each) do
  activate_authlogic
  UserSession.create(users(:user_a))
end
1) 为两个用户和一些资产(本例中为三个)定义设备(或者交替使用类似FactoryGirl的东西)。用户a的资产命名为资产a*,用户b的资产命名为资产b*)

2) 测试简单如下:

   users(:users_a).assets.should have(3).records
   users(:users_a).assets.should include(assets(:asset_a_a))
   users(:users_a).assets.should include(assets(:assets_a_b))
   users(:users_a).assets.should include(assets(:assets_a_c))
before(:each) do
  activate_authlogic
  UserSession.create(users(:user_a))
end
你可以像这样微调这个 用户(:users_a).assets.find(assets(:assets_a_a).id).应包括(assets(:assets_a_a)) 用户(:users_a).assets.find(资产(:asset_a_a).id)。不应包括(资产(:asset_b_a))

如果您完全愿意,可以对控制器部件使用类似的测试

尽管对于这些基本功能是否需要测试存在很多讨论,因为处理模型中定义的关联主要是Rails的核心功能

就我个人而言,我做这种测试是有原因的。在许多情况下,这种与许可相关的关联很快变得更加复杂,无论如何都需要详细的测试。或者有人可能会更改关联的参数并破坏某些内容

II-关于控制器内的当前用户部件

当然,这取决于您首先如何处理身份验证。如果您使用类似AuthLogic(或其他)的插件,它可能有一些方法允许在rspec中模拟登录。对于authlogic,您可以执行以下操作:

   users(:users_a).assets.should have(3).records
   users(:users_a).assets.should include(assets(:asset_a_a))
   users(:users_a).assets.should include(assets(:assets_a_b))
   users(:users_a).assets.should include(assets(:assets_a_c))
before(:each) do
  activate_authlogic
  UserSession.create(users(:user_a))
end
这将激活authlogic和“登录”用户。 然后运行控制器

  get :index
  response.should be_success
  response.should render_template :index
  assigns(:assets).should # => more or less as above, check that there are the right aessets.

首先,要非常小心AssetController

假设您使用的是Rails 3,“assets_path”也是用于加载应用程序资产的路径,因此,您在该控制器中写入会话的任何内容都将被忽略。可能不是你想要的!我强烈考虑重命名控制器。< /P> 我首先在登录块中创建用户

module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = Factory.create(:user)
      sign_in @user
    end
  end
end
然后可以将其加载到spec_helper.rb文件中

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
end
最后,您可以在测试中使用它

describe MyController do
  context "#index" do
    login_user
    before(:each) do
      @assets = []
      5.times{ @assets << Factory.create(:asset, :user => @user)}
    end

    it "should test index" do
      get :index
      assigns(:assets).should eq(@assets)
    end
  end
end
描述MyController所做的事情
上下文“#索引”do
登录用户
在…之前做
@资产=[]
5.次{@assets@user)}
结束
它“应该测试索引”吗
获取:索引
分配(:资产)。应等于(@assets)
结束
结束
结束
现在,这将正确地测试您的资产列表


编辑:刚刚意识到,我在这里使用FactoryGirl/Desive,你可能会也可能不会

首先,要非常小心AssetController

假设您使用的是Rails 3,“assets_path”也是用于加载应用程序资产的路径,因此,您在该控制器中写入会话的任何内容都将被忽略。可能不是你想要的!我强烈考虑重命名控制器。< /P> 我首先在登录块中创建用户

module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = Factory.create(:user)
      sign_in @user
    end
  end
end
然后可以将其加载到spec_helper.rb文件中

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
end
最后,您可以在测试中使用它

describe MyController do
  context "#index" do
    login_user
    before(:each) do
      @assets = []
      5.times{ @assets << Factory.create(:asset, :user => @user)}
    end

    it "should test index" do
      get :index
      assigns(:assets).should eq(@assets)
    end
  end
end
描述MyController所做的事情
上下文“#索引”do
登录用户
在…之前做
@资产=[]
5.次{@assets@user)}
结束
它“应该测试索引”吗
获取:索引
分配(:资产)。应等于(@assets)
结束
结束
结束
现在,这将正确地测试您的资产列表


编辑:刚刚意识到,我在这里使用FactoryGirl/Desive,你可能会也可能不会

我也在使用factoryGirl/Desive,但我还没有定义任何工厂。那家工厂应该是什么样子?我已经将控制器重命名为TemplatesControllerI,使索引函数正常工作。show函数是否也一样?只是一个注释…测试通过,只需放置赋值(:assets)…如果我放置赋值(:assets)。如果eq(@assets)失败,首先,我编辑了我的答案,我在文本的早期关闭了上下文块。测试确实应该在它所测试的上下文中!那是