3

我有一个控制器索引测试,它获得了一个 ActiveRecord 范围。测试目前看起来像这样(包括一些内联调试的东西):

describe "GET index" do
  it "assigns all schools as @schools" do
    get :index
    puts assigns(:schools).class
    puts School.populated.class
    assigns(:schools).should == School.populated
  end
end

输出是这样的:

ActiveRecord::Relation
ActiveRecord::Relation

expected: []
     got: [] (using ==)
Diff:

这绝对不是我在最近版本的 Rails 和 rSpec 中第一次遇到这种情况。以前,同事只会将物品包装在 ato_a中进行比较,我觉得这有点脏,可能不是一个好的解决方案。

有任何想法吗?我很好奇为什么它认为它们不同,以及相同的测试如何在旧版本的 Rails 和/或 rSpec 中通过。

4

2 回答 2

1

eql与==相同。Rspec演讲的作者只不要使用!=,而是使用should_not

actual.should == expected
#is interpreted as this:

actual.should.==(expected)

#This is not true for !=. Ruby interprets this: actual.should != expected
#as follows:

!(actual.should.==(expected))

更新:Relation 提供了延迟加载模式,因此您在该步骤上没有任何执行的查询。这意味着在第一次请求时触发查询

于 2011-09-08T10:25:45.247 回答
1

如果你想比较数组,你应该写

 assigns(:schools).all.should =~ School.populated.all
于 2011-09-08T22:49:49.913 回答