Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.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 如何测试引用带有Shoulda的类属性的命名_范围?_Ruby On Rails_Ruby_Unit Testing_Shoulda - Fatal编程技术网

Ruby on rails 如何测试引用带有Shoulda的类属性的命名_范围?

Ruby on rails 如何测试引用带有Shoulda的类属性的命名_范围?,ruby-on-rails,ruby,unit-testing,shoulda,Ruby On Rails,Ruby,Unit Testing,Shoulda,我有以下ActiveRecord类: class User < ActiveRecord::Base cattr_accessor :current_user has_many :batch_records end class BatchRecord < ActiveRecord::Base belongs_to :user named_scope :current_user, lambda { { :conditions => { :user_id

我有以下ActiveRecord类:

class User < ActiveRecord::Base
  cattr_accessor :current_user
  has_many :batch_records
end

class BatchRecord < ActiveRecord::Base
  belongs_to :user

  named_scope :current_user, lambda {
    { :conditions => { :user_id => User.current_user && User.current_user.id } }
  }
end
它不起作用的原因是,在定义类时,正在评估
方法中对
User.current\u User
的调用。在运行测试时,我将在
设置
块中更改
current\u User
的值

下面是我为测试这个命名的_范围所做的工作:

class BatchRecordTest < ActiveSupport::TestCase
  context "with User.current_user set" do
    setup do
      mock_user = flexmock('user', :id => 1)
      flexmock(User).should_receive(:current_user).and_return(mock_user)
    end

    should_have_named_scope :current_user,
                            :conditions => { :assigned_to_id => 1 }
  end
end
class BatchRecordTest1)
flexmock(用户)。应接收(:当前用户)。和返回(模拟用户)
结束
应将\u命名为\u作用域:当前\u用户,
:条件=>{:分配给\u id=>1}
结束
结束

那么,您将如何使用进行测试?

我认为您的做法是错误的。首先,为什么需要使用命名范围?这就行了吗

class BatchRecord < ActiveRecord::Base
  belongs_to :user

  def current_user
    self.user.class.current_user
  end
end
哦,顺便说一句,现在我再看看你的问题,也许它不起作用的原因之一是,
User.current\u User&&User.current\u User.id
行将返回一个布尔值,而不是你想要的整数编辑我是个白痴


命名范围确实是一种绝对错误的方法。命名范围用于返回集合,而不是单个记录(这是此操作失败的另一个原因)。它还对数据库进行了一个不必要的调用,导致了一个您不需要的查询。

我刚刚意识到答案就在我眼前。我应该在协会的另一方工作,即
当前用户。批处理记录
。然后我只需在
用户
模型上测试
命名的_scope
,一切正常


@-关于线程安全问题,
当前用户
属性是由my
ApplicationController
中的
前过滤器
设置的,因此它会根据请求进行修改。我知道,如果我选择在多线程环境中运行(目前不是这样),仍然有可能发生灾难。我想这个解决方案完全是另一个话题。

Ruby逻辑运算符(&&,| |)的工作方式与您建议的不同。它们返回最后计算的参数。因此,如果user.current\u user或user.current\u user.id是布尔值,那么current\u用户代码将只返回一个布尔值-我假设不是这样。哇,你说得对!清晨喝酒对我的Ruby技能没有帮助。我以前不得不不断地与当前的用户交流,我想在读了这篇文章之后,我将不得不接受它。谢谢你的评论。
class BatchRecord < ActiveRecord::Base
  belongs_to :user

  def current_user
    self.user.class.current_user
  end
end
class CurrentUser

  attr_reader :user, :session

  def initialize(user, session)
    @user, @session = user, session
  end

  def authenticated?
    ...
  end

  def method_missing(*args)
    user.send(*args) if authenticated?
  end

end