簡體   English   中英

Rails單元測試失敗

[英]Rails unit test failing

以下用戶測試順利通過,用戶有效:

user_test.rb:

require 'test_helper'

class UserTest < ActiveSupport::TestCase

  def setup
    @user = User.new(name: "Example User", email: "user@example.com", callsign: "example",
                     password: "foobar", password_confirmation: "foobar")
  end

  test "user should be valid" do
    assert @user.valid?
  end
end

用戶模型:

class User < ActiveRecord::Base

  attr_accessor :remember_token, :activation_token, :reset_token

  has_many :personas, dependent: :destroy
  has_secure_password

  before_save do
    email.downcase!
    callsign.downcase!
  end
  before_create :create_activation_digest

  validates :name, presence: true,
                   length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence:   true,
                    format:     { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  VALID_CALLSIGN_REGEX = /\A[a-z\d\-.\_]+\z/i
  validates :callsign, presence:   true,
                       length:     { maximum: 20 },
                       format:     { with: VALID_CALLSIGN_REGEX },
                       uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 }, allow_blank: true

  def to_param
    callsign
  end
  .
  .
end

但是,當我在persona_test中設置完全相同的用戶時,驗證將失敗。 (角色驗證也失敗,每個用戶都有多個角色)

persona_test.rb:

require 'test_helper'

class PersonaTest < ActiveSupport::TestCase

  def setup
    @user = User.new(name: "Example User", email: "user@example.com", callsign: "example",
                       password: "foobar", password_confirmation: "foobar")
    @persona = @user.personas.build(name: "Bazman", callsign: "Baz")
  end

  test "user should be valid" do
    assert @user.valid?
  end

  test "persona should be valid" do
    assert @persona.valid?
  end
end

角色模型:

class Persona < ActiveRecord::Base

  belongs_to :user

  before_save do
    self.callsign.downcase!
    set_persona_id
  end

  validates :name, presence: true,
                   length:   { maximum: 50 }
  VALID_CALLSIGN_REGEX = /\A[a-z\d\-.\_]+\z/i
  validates :callsign, presence:   true,
                       length:     { maximum: 20 },
                       format:     { with: VALID_CALLSIGN_REGEX },
                       uniqueness: { case_sensitive: false }
  validates :user_id, presence: true
  validates :persona_id, presence: true

  def to_param
    callsign
  end
  .
  .
end

測試輸出失敗:

FAIL["test_user_should_be_valid", PersonaTest, 0.754914]
test_user_should_be_valid#PersonaTest (0.75s)
Failed assertion, no message given.
test/models/persona_test.rb:18:in `block in <class:PersonaTest>'

FAIL["test_persona_should_be_valid", PersonaTest, 0.893247]
test_persona_should_be_valid#PersonaTest (0.89s)
Failed assertion, no message given.
test/models/persona_test.rb:22:in `block in <class:PersonaTest>'

我不明白為什么當設置用戶與user_test.rb中的用戶相同時,persona_test.rb中的User驗證失敗。 您是否不允許在角色測試中測試用戶? 如果是這樣,我如何成功測試角色? 每個角色都屬於一個用戶,因此我必須創建一個用戶才能創建一個角色。

編輯:

persona_test.rb:

require 'test_helper'

class PersonaTest < ActiveSupport::TestCase

  def setup
    @user = User.new(name: "Example User", email: "user@example.com", callsign: "example",
                       password: "foobar", password_confirmation: "foobar")#, activated: true)
    @persona = @user.personas.build(name: "Bazman", callsign: "Baz")
    @persona.user = @user
    @persona.persona_id = 1
  end

  test "user should be valid" do
    assert @user.valid?, @user.errors.full_messages
  end

  test "persona should be valid" do
    assert @persona.valid?, @persona.errors.full_messages
  end
end

通過上面更新的角色測試,我收到錯誤消息“用戶不能為空”。 為什么是

@persona.user = @user

不工作嗎?

在角色模型中,您具有:

  validates :user_id, presence: true
  validates :persona_id, presence: true

但是看起來好像沒有設置user_id。 嘗試在測試中使用@persona.user = @user進行設置。

另外,作為調試工具,您可以在測試中打印@persona.errors.full_messages ,以查看其確切位置尚未驗證。

例如assert @persona.valid?, @persona.errors.full_messages

希望能有所幫助。

編輯 :根據下面的注釋,該行實際上應該是@persona.user_id = @user.id 您可以實現相同效果的另一種方法是將記錄實際保存到數據庫中。 因此,在設置功能中,應使用create而不是build 但是,這會比較慢。

斷言失敗的原因是在Persona中的某些驗證不會通過:

validates :user_id, presence: true
validates :persona_id, presence: true

在將驗證保存到數據庫之前,先運行驗證。 對於新記錄, user_idpersona_id仍為nil

由於Persona無效,因此User在其他測試中也將無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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