我对测试很新,并且有一个我想要测试的UsersController。我从新行动开始,到目前为止有以下几点;
require 'spec_helper'
describe UsersController do
describe "GET 'new'" do
it "assigns a new User to @user" do
user = User.new
get :new
assigns(:user).should eq(user)
end
it "renders the :new template"
end
end
到目前为止,我的UsersController看起来像这样
class UsersController < ApplicationController
def new
@user = User.new
end
end
我预计我的第一次测试会起作用,但是当我运行它时,我得到以下内容;
Failures:
1) UsersController GET 'new' assigns a new User to @user
Failure/Error: assigns(:user).should eq(user)
expected: #<User id: nil, email: nil, username: nil, password_digest: nil, created_at: nil, updated_at: nil>
got: #<User id: nil, email: nil, username: nil, password_digest: nil, created_at: nil, updated_at: nil>
(compared using ==)
Diff:#<User:0x007fe4bbfceed0>.==(#<User:0x007fe4bce5c290>) returned false even though the diff between #<User:0x007fe4bbfceed0> and #<User:0x007fe4bce5c290> is empty. Check the implementation of #<User:0x007fe4bbfceed0>.==.
# ./spec/controllers/users_controller_spec.rb:9:in `block (3 levels) in <top (required)>'
在控制台中玩游戏会显示以下内容;
irb(main):001:0> a = User.new
=> #<User id: nil, email: nil, username: nil, password_digest: nil, created_at: nil, updated_at: nil>
irb(main):002:0> b = User.new
=> #<User id: nil, email: nil, username: nil, password_digest: nil, created_at: nil, updated_at: nil>
irb(main):003:0> a == b
=> false
所以现在我很好奇为什么2个空的ActiveRecord对象不相等(毕竟,Array.new == Array.new
返回true),以及我必须做些什么来让我的测试通过。
答案 0 :(得分:6)
您应该将测试更改为以下内容:
describe UsersController do
describe "GET 'new'" do
it "assigns a new User to @user" do
get :new
assigns(:user).should be_new_record
assigns(:user).kind_of?(User).should be_true
end
it "renders the :new template" end
end
你会有同样的效果。如果没有保存两个对象,它们没有Rails的主键将使用object_id相等来比较它们,这就是为什么它们不是 == 。
答案 1 :(得分:1)
Activerecord相等主要是关于两个对象是否对应于同一个数据库行(例如,对应于同一行的两个实例是相等的,即使您开始更改其中一个的属性)。
如果您两次调用User.new
并保存每个对象,则最终会在数据库中显示2个不同的行。因此,对他来说,它们不应该是平等的。
就你的考试而言,你可以做两件事。一种方法是检查分配的用户是否为用户并且未保存。
另一种方式是
User.should_receive(:new).and_return(@user)
get :new
assigns(:user).should == @user