すべてが、のRails 3.2:失敗したアサーションの独自性:真
私はモデルのテストで問題が生じています、私は次のフィールドを使用して、単純な顧客テーブルを持っている:名前:文字列、場所:文字列、FULL_NAME:文字列、アクティブ:ブール値。私は次の "#{name}#{location}"を含む隠しフィールドとしてfull_nameフィールドを使用しており、full_nameフィールドの一意性についてレコードをテストしています。
「顧客は一意のfull_nameなしで有効ではありません」というテストは、問題が発生しているというテストです。重複するレコードの挿入をテストしようとしています。 assert!customer.saveの前にバン(!)を取り除くと、テストは合格になります。これは、テストを実行する前にテーブルにロードされていないフィクスチャのように動作しています。私はrake test:unitsを実行しています。開発モードでサーバーを実行しようとしましたが、スキャフォールディングを使用して2つのレコードが挿入され、2回目の挿入が失敗し、予期した動作である「フルネームがすでに取得されています」というエラーが報告されます。
誰でも私がどこでテストをねじったのか教えていただけますか?事前に
おかげ
Reback
モデル:
class Customer < ActiveRecord::Base
attr_accessible :active, :full_name, :location, :name
validates :active, :location, :name, presence: true
validates :full_name, uniqueness: true # case I am trying to test
before_validation :build_full_name
def build_full_name
self.full_name = "#{name} #{location}"
end
end
テスト・フィクスチャ
one:
name: MyString
location: MyString
full_name: MyString
active: false
two:
name: MyString
location: MyString
full_name: MyString
active: false
general:
name: 'Whoever'
location: 'Any Where'
full_name: ''
active: true
customers.yml
私は固定具がモデルを通ってbuild_full_nameヘルパーがあろうと処理されると仮定する:の
テストユニットヘルパーは
require 'test_helper'
class CustomerTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
fixtures :customers
# Test fields have to be present
test "customer fields must not be empty" do
customer = Customer.new
assert customer.invalid?
assert customer.errors[:name].any?
assert customer.errors[:location].any?
assert_equal " ", customer.full_name # This is processed by a helper function in the model
assert customer.errors[:active].any?
end
# Test full_name field is unique
test "customer is not valid without a unique full_name" do
customer = Customer.new(
name: customers(:general).name,
location: customers(:general).location,
full_name: customers(:general).full_name,
active: customers(:general).active
)
assert !customer.save # this is the line that fails
assert_equal "has already been taken", customer.errors[:full_name].join(', ')
end
end