2012-05-01 10 views
1

すべてが、の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 

答えて

0

customer_test.rb Iは、固定具customers.ymlに問題を発見しましたデータがテストデータベースに挿入される前に呼び出されます。それは事実ではないようです。

次のように私は、フィクスチャを変更し、それが問題を修正:

one: 
name: MyString 
location: MyString 
full_name: MyString 
active: false 

two: 
name: MyString2   # changed for consistency, was not the problem 
location: MyString2 
full_name: MyString2 
active: false 

general: 
name: 'Whoever' 
location: 'Any Where' 
full_name: 'Whoever Any Where' #Here was the problem 
active: true 
関連する問題