![](/img/trans.png)
[英]how do I use curl to test my Rails controller create action.. or can I use rspec?
[英]How do I test the assignment of an instance variable in the new action of my controller with rspec?
我是一個相當新的測試,並有一個我想測試的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),以及我必須做些什么來讓我的測試通過。
您可能應該將測試更改為以下內容:
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相等來比較它們,這就是為什么它們不是== 。
Activerecord相等主要是關於兩個對象是否對應於同一個數據庫行(例如,對應於同一行的兩個實例是相等的,即使您開始更改其中一個的屬性)。
如果您兩次調用User.new
並保存每個對象,則最終會在數據庫中顯示2個不同的行。 因此,對我而言,它們不應該是平等的。
在測試方面,你可以做兩件事。 一種方法是檢查分配的用戶是否為用戶並且未保存。
另一種方式是沿襲的
User.should_receive(:new).and_return(@user)
get :new
assigns(:user).should == @user
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.