Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.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 如何在Rails中测试记录顺序?_Ruby On Rails_Testing - Fatal编程技术网

Ruby on rails 如何在Rails中测试记录顺序?

Ruby on rails 如何在Rails中测试记录顺序?,ruby-on-rails,testing,Ruby On Rails,Testing,我发现测试来自数据库的记录是否正确排序非常冗长和乏味。 我正在考虑使用数组“==”方法来比较两个搜索数组。数组的元素和顺序必须相同,因此看起来很合适。问题是,如果元素丢失,即使严格按照正确顺序排列,测试也会失败 我想知道是否有更好的方法 我认为对您选择的记录进行排序将为您提供一个更合适的有序结果集,事实上,对结果进行排序总是很好的 这样,我认为您将不需要array==方法 嗯 sameeraRails 4 app/models/person.rb default_scope { order(na

我发现测试来自数据库的记录是否正确排序非常冗长和乏味。 我正在考虑使用数组“==”方法来比较两个搜索数组。数组的元素和顺序必须相同,因此看起来很合适。问题是,如果元素丢失,即使严格按照正确顺序排列,测试也会失败


我想知道是否有更好的方法

我认为对您选择的记录进行排序将为您提供一个更合适的有序结果集,事实上,对结果进行排序总是很好的

这样,我认为您将不需要array==方法


sameeraRails 4

app/models/person.rb

default_scope { order(name: :asc) }
test "people should be ordered by name" do
  xavier = Person.create(name: 'xavier')
  albert = Person.create(name: 'albert')
  all    = Person.all
  assert_operator all.index(albert), :<, all.index(xavier)
end
default_scope order('name ASC')
test "people should be ordered by name" do 
  xavier = Person.create name: 'xavier'
  albert = Person.create name: 'albert'
  assert Person.all.index(albert) < Person.all.index(xavier)
end

test/models/person.rb

default_scope { order(name: :asc) }
test "people should be ordered by name" do
  xavier = Person.create(name: 'xavier')
  albert = Person.create(name: 'albert')
  all    = Person.all
  assert_operator all.index(albert), :<, all.index(xavier)
end
default_scope order('name ASC')
test "people should be ordered by name" do 
  xavier = Person.create name: 'xavier'
  albert = Person.create name: 'albert'
  assert Person.all.index(albert) < Person.all.index(xavier)
end

test/unit/person\u test.rb

default_scope { order(name: :asc) }
test "people should be ordered by name" do
  xavier = Person.create(name: 'xavier')
  albert = Person.create(name: 'albert')
  all    = Person.all
  assert_operator all.index(albert), :<, all.index(xavier)
end
default_scope order('name ASC')
test "people should be ordered by name" do 
  xavier = Person.create name: 'xavier'
  albert = Person.create name: 'albert'
  assert Person.all.index(albert) < Person.all.index(xavier)
end
测试“人员应按姓名排序”do
xavier=Person.create名称:“xavier”
albert=Person.create名称:“albert”
断言Person.all.index(albert)
我还没有找到一种内置的方法来很好地实现这一点,但这里有一种方法可以检查对象数组是否按成员排序:

class MyObject
  attr_reader :a

  def initialize(value)
    @a = value
  end
end

a = MyObject.new(2)
b = MyObject.new(3)
c = MyObject.new(4)

myobjects = [a, b, c]

class Array
  def sorted_by?(method)
    self.each_cons(2) do |a|
      return false if a[0].send(method) > a[1].send(method)
    end
    true
  end
end

p myobjects.sorted_by?(:a) #=> true
然后,您可以使用以下方式使用它:

test "people should be ordered by name by default" do 
  people = Person.all
  assert people.sorted_by?(:age)
end

当我问这个问题时,我偶然发现了我想要的东西。使用该方法,可以使测试非常简洁:

assert Person.all.each_cons(2).all?{|i,j| i.name >= j.name}

Sameera,谢谢你的回答,但我要问的是如何测试排序,而不是如何排序。gamov,首先循环记录集并将ID获取到一个数组,然后复制同一个数组并对其进行排序(array.sort),然后比较两个数组,它们应该是一对一的匹配。cheers sameeraThis很好,但不能很好地与包含大量对象的数组进行缩放。顺便说一下,在rails 3中可以使用assert_操作符。对于下一个试图重新格式化此{..}的人,请执行..结束-不要执行此操作。英雄联盟