RSpec 在索引中 instance_variable
RSpec for instance_variable in Index
这是一个非常简单的问题,但我找不到任何解决方案。已经3天了。请帮忙。
所以我在
中有这个
users_controller.rb
def index
@users = @users.normal.order(:name).page params[:page]
end
所以我的 users_controller_spec.rb
里有这个
it "assign all normal users to @users" do
users = User.normal.all
get :index
expect(assigns(:users)).to eq(users)
end
我的代码基于 https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs .
在我的终端中 运行 rspec 之后,这是输出。
Diff:
@@ -1,4 +1,4 @@
-[#<User:0x00000004aa32b0
+[#<User:0x00000004a085a8
id: 2,
name: "Christian Galamay",
admin: false,
@@ -20,7 +20,7 @@
updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00,
role: "Normal",
avatar: nil>,
- #<User:0x00000004aa2ea0
+ #<User:0x000000049dbd78
id: 3,
name: "Grace Sojor",
admin: false,
@@ -42,7 +42,7 @@
updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00,
role: "Normal",
avatar: nil>,
- #<User:0x00000004aa2ab8
+ #<User:0x000000049db760
id: 4,
name: "Karl Pandacan",
admin: false,
输出表明所有值都相同,除了用户后面的十六进制。所以我的问题是(1)为什么在比较两个ActiveRecord时包含User之后的十六进制(2)是否有任何方法或函数可以用来忽略User中的十六进制。谢谢
您可以简单地检查用户数组而不是活动记录关系
expect(assigns(:users).to_a).to eq(users.to_a)
你的数组在值上是等价的,但是你的规范失败了,因为你比较的是引用相等而不是值相等,因为你的控制器将用户加载到一个单独的变量而不是你的规范。
尝试使用 as_json
:
比较您的 collection 的值
expect(assigns(:users).as_json).to eq(users.as_json)
输出有点误导。这两个东西不相等,因为它们是关系对象,两个 ActiveRecord::Relation
对象之间的 ==
通过比较生成的 sql 来工作。在您的情况下,关系不相等:在控制器中您正在分页并设置订单。
Rspec 试图通过显示 2 个对象的 to_s
输出的差异来提供帮助,但这最终会比较查询结果(它们确实是相同的对象)和所以它在字符串输出中发现的唯一区别是对象 ID。这在一定程度上是运气——如果没有 order 子句,对象可能 return 以不同的顺序编辑。明确地说:显示的差异输出只是为了帮助您,并不意味着 rspec 就是这样进行比较的。
如果你想要比较查询的结果,那么你可以使用 to_a
来做到这一点:
expect(assigns(:users)).to eq(users.to_a)
如果你不关心顺序你也可以
expect(assigns(:users)).to match_array(users)
这是一个略有不同的测试:如果数据库决定 return 结果不同,它不会失败,正如我上面提到的,这是可能的。
这是一个非常简单的问题,但我找不到任何解决方案。已经3天了。请帮忙。
所以我在
中有这个users_controller.rb
def index
@users = @users.normal.order(:name).page params[:page]
end
所以我的 users_controller_spec.rb
里有这个it "assign all normal users to @users" do
users = User.normal.all
get :index
expect(assigns(:users)).to eq(users)
end
我的代码基于 https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs .
在我的终端中 运行 rspec 之后,这是输出。
Diff:
@@ -1,4 +1,4 @@
-[#<User:0x00000004aa32b0
+[#<User:0x00000004a085a8
id: 2,
name: "Christian Galamay",
admin: false,
@@ -20,7 +20,7 @@
updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00,
role: "Normal",
avatar: nil>,
- #<User:0x00000004aa2ea0
+ #<User:0x000000049dbd78
id: 3,
name: "Grace Sojor",
admin: false,
@@ -42,7 +42,7 @@
updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00,
role: "Normal",
avatar: nil>,
- #<User:0x00000004aa2ab8
+ #<User:0x000000049db760
id: 4,
name: "Karl Pandacan",
admin: false,
输出表明所有值都相同,除了用户后面的十六进制。所以我的问题是(1)为什么在比较两个ActiveRecord时包含User之后的十六进制(2)是否有任何方法或函数可以用来忽略User中的十六进制。谢谢
您可以简单地检查用户数组而不是活动记录关系
expect(assigns(:users).to_a).to eq(users.to_a)
你的数组在值上是等价的,但是你的规范失败了,因为你比较的是引用相等而不是值相等,因为你的控制器将用户加载到一个单独的变量而不是你的规范。
尝试使用 as_json
:
expect(assigns(:users).as_json).to eq(users.as_json)
输出有点误导。这两个东西不相等,因为它们是关系对象,两个 ActiveRecord::Relation
对象之间的 ==
通过比较生成的 sql 来工作。在您的情况下,关系不相等:在控制器中您正在分页并设置订单。
Rspec 试图通过显示 2 个对象的 to_s
输出的差异来提供帮助,但这最终会比较查询结果(它们确实是相同的对象)和所以它在字符串输出中发现的唯一区别是对象 ID。这在一定程度上是运气——如果没有 order 子句,对象可能 return 以不同的顺序编辑。明确地说:显示的差异输出只是为了帮助您,并不意味着 rspec 就是这样进行比较的。
如果你想要比较查询的结果,那么你可以使用 to_a
来做到这一点:
expect(assigns(:users)).to eq(users.to_a)
如果你不关心顺序你也可以
expect(assigns(:users)).to match_array(users)
这是一个略有不同的测试:如果数据库决定 return 结果不同,它不会失败,正如我上面提到的,这是可能的。