0

「Charity」という名前のオブジェクトがあり、各慈善団体に一意の名前があることを確認したいのですが、残念ながら、次の失敗したテストが発生しています。工場に問題があると思われます。

Failures
     1) Charity name is already taken
       Failure/Error: it { @charity_with_same_name.should_not be_valid }
       NoMethodError:
         undefined method 'valid?' for nil:NilClass
       ...

チャリティー オブジェクトは、ユーザー オブジェクトに属しています。charity.rb は次のとおりです。

class Charity < ActiveRecord::Base
  attr_accessible :name, :description, :summary
  belongs_to :user

  validates :name, presence: true, uniqueness: { case_sensitive: false }, length: { maximum: 40 }
  validates :summary, presence: true, length: { maximum: 140 }
  validates :description, presence: true
  validates :user_id, presence: true

  default_scope order: 'charities.created_at DESC'
end

charity_spec.rb の関連部分は次のとおりです。

require 'spec_helper'

describe Charity do

  let(:user) { FactoryGirl.create(:user) }
  #before { @charity = user.charities.build(summary: "Lorem ipsum") }
  before { @charity = user.charities.build(FactoryGirl.attributes_for(:charity)) }
  # this makes sure that all the attributes for charity are set, whereas
  #the previous code only sets the "summary" attribute

  subject { @charity }
  ...
  describe "name is already taken" do
    before do
      charity_with_same_name = @charity.dup
      charity_with_same_name.name = @charity.name.upcase
      charity_with_same_name.save
    end

    it { @charity_with_same_name.should_not be_valid }
  end
  ...

factory.rb は次のとおりです。

FactoryGirl.define do
  factory :user do
    sequence(:name)  { |n| "Person #{n}" }
    sequence(:email) { |n| "person_#{n}@example.com" }   
    password "foobar"
    password_confirmation "foobar"
    ...

    factory :charity do
      sequence(:name)        { |n| "charity #{n}" }
      sequence(:summary)     { |n| "summary #{n}" }
      sequence(:description) { |n| "description #{n}" }
    end
end

私は何を間違えましたか?

4

1 に答える 1

0

charity_with_same_namebefore ブロックでインスタンス変数を作成し (charity_with_same_nameに変更@charity_with_same_name)、 に変更it { @charity_with_same_name.should_not be_valid }specify { @charity_with_same_name.should_not be_valid }てこれを渡すことができます。

問題は、@charity_with_same_name初期化していないため、存在しないことです。を設定しただけcharity_with_same_nameです。また、 はsubject { @charity }it参照して@charityいるため、it { @charity_with_same_name.should_not be_valid }ここでは意味がありません。

@charity.save編集:上記の実行に加えて、ブロックに行を追加する必要がありますbefore(行の直前charity_with_same_name = @charity.dup)。これは、複製されたレコードがまだデータベースに保存されていない@charityため、同じ名前を持っているにもかかわらず、検証に合格するため (合格すべきでない場合) に必要です。@charity慈善団体が保存されると、検証テストによってデータベースがチェックされ、その名前が既に使用されていることが確認されます。

于 2012-09-28T19:53:12.420 に答える