这是一个非常简单的问题,但我找不到任何解决方案。已经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后包含用户之后的十六进制(2)是否有任何方法或函数用于忽略用户中的十六进制。谢谢
答案 0 :(得分:3)
您只需检查用户数组而不是活动记录关系
expect(assigns(:users).to_a).to eq(users.to_a)
答案 1 :(得分:2)
您的数组在值上是等价的,但是您的规范失败了,因为您正在比较引用相等而不是值相等,因为您的控制器正在将用户加载到与您的规范不同的单独变量中。
尝试使用#include <string>
#include <string.h>
#include <thread>
#include <math.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
char *fbp1 = 0;
int fbfd1;
long int screensize1;
int main() {
fbfd1 = 0;
screensize1 = 0;
fbfd1 = open("/var/tmp/Xvfb_screen0", O_RDWR);
screensize1 = 1920 * 1080 * 4;
fbp1 = (char*)mmap(0,
screensize1,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fbfd1,
0);
for (int i = 0; i < 1000; i++) {
cout << ((int*)fbp1)[i] << endl;
}
return 0;
}
比较您的收藏集的价值:
as_json
答案 2 :(得分:2)
输出略有误导。这两件事情不相同,因为它们是关系对象,两个==
对象之间的ActiveRecord::Relation
通过比较生成的sql来工作。在您的情况下,关系不相等:在控制器中,您正在分页并设置订单。
Rspec尝试通过显示2个对象的to_s
输出的差异来提供帮助,但是这最终会比较查询的结果(确实是相同的对象),因此它找到的唯一区别在该字符串输出中是对象ID。这部分是运气 - 没有订单子句,对象可能以不同的顺序返回。显而易见:显示的diff输出就是为了帮助你,这并不意味着这就是rspec进行比较的方式。
如果你想要的是比较查询的结果,那么你可以使用to_a
来做到这一点:
expect(assigns(:users)).to eq(users.to_a)
如果您不关心订单,也可以
expect(assigns(:users)).to match_array(users)
这是一个稍微不同的测试:如果db决定以不同的方式返回结果,它将不会失败,这可能如上所述。