簡體   English   中英

如何使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM