需要在 RSpec 中按值排序散列的测试方法

Testing method that needs to sort hash by value in RSpec

我正在尝试测试采用散列并对其重新排序的方法。我目前有:

def sort_views 
    help = view_counter.sort_by { |route, length| length }.reverse.to_h
    p help         #just so I can see the output in the test
  end

那么对于我的测试我有:

describe "#sort_views" do
    let(:result) do {
      "/help_page/1" => 3,
      "/about/2" => 1,
      "/contact" => 1,
      "/home" => 1,
      "/index" => 2,
    }     end
    it "then sorts them via the view count" do
      expect(subject.sort_views).to be(result)
    end
  end

我的问题是测试通过了....但是,我现在故意把结果中的顺序弄错了。然而方法中的 p help 正确地重新排序了它,所以输出实际上是不同的。我试过 eq 和 eql,但我相信它们只是测试结构?我知道平等是行不通的...

对于上下文,我的 p 帮助输出:{"/help_page/1"=>3, "/index"=>2, "/about/2"=>1, "/home"=>1, "/contact"=>1} 当测试是 运行。

那么有没有一种方法可以让我在测试中测试结果哈希的顺序而不调用 .sort_by { |route, length| length }.reverse.to_h 也在我的结果变量上??

那是因为哈希值相同,参见 this post。哈希实际上没有顺序的概念,当您调用 sort_by 方法时,它会将数据转换为数组,对数组进行排序,然后返回一个数组。如果您将数组转换为散列,您基本上会丢失顺序。

如果您关心此处的顺序,请删除 to_h 并将数据作为数组处理。然后你的测试应该工作。

测试时可以用.to_a,排序时不需要倒序

view_counter.sort_by { |route, length| -length }

let(:result) do
  {
    "/help_page/1" => 3,
    "/about/2" => 1,
    "/contact" => 1,
    "/home" => 1,
    "/index" => 2,
  }.to_a
end