2

Ruby Noob-私はSOを検索し、Rails Guide on Testingを読み、運が悪かったのでRailsCastを見ました。

メソッドの関連付けを、自分が作成したテストと調整できません。現在(以下のコード)、名前の存在をチェックするテストと電子メールの存在をチェックするテストの両方で、失敗やエラーなしで合格します。

モデルから両方の検証ステートメントを削除すると、両方のテストが失敗します。これも理にかなっています。

ただし、どちらか一方だけを削除すると

validates :name, :presence => true

また

validates :email, :presence => true

モデルから、両方のテストが失敗することなく合格します。この結果は私には意味がありません。誤ったテストを作成しましたか?


user.rbモデル:

class User < ActiveRecord::Base
  attr_accessible :email, :name 

  has_many :connections

  validates :name, :presence => true
  validates :email, :presence => true
end

test / unit / user_test.rb

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  test "a user should have a name" do
    user = User.new
    assert !user.save
  end

  test "a user should have an email" do
    user = User.new
    assert !user.save
  end
end
4

1 に答える 1

1

はい、誤ったテストを作成しました。どのテストでも、ユーザーは名前を持っている必要があり、ユーザーが名前の存在を検証する必要があるため、単一の前提のみをテストする必要があります。

最初に、検証ステートメントの1つだけがモデルに存在するため、3番目のケースで両方のテストが合格する理由を考えてみましょう。

テストコード、

   user = User.new
   !user.saveをアサートします

だからあなたがどちらかを持っているvalidates :name, :presence => trueならvalidates :email, :presence => true

user.save falseを返します。存在する検証が有効になるため、ユーザーオブジェクトは保存されません。

名前のエラーをチェックするようにテストを変更することをお勧めします。

user = User.new
 !user.saveをアサートします
 !user.errors.get(:email).blankをアサートしますか?
user = User.new
 !user.saveをアサートします
 !user.errors.get(:name).blankをアサートしますか?

https://github.com/thoughtbot/shouldaもご覧になると、テストの作成が簡単になります:)

于 2012-11-06T00:32:49.930 に答える