0

has_secure_password を使用した Account モデルがあります (2 つの attr_accessors を自動的に作成します: password と password_confirmation、作成時に必要)。アカウント オブジェクトを更新するときにこれらのフィールドを指定することは避けたいので、次のように RSpec と factoryGirl を使用してテストを作成しようとしています。

describe Account do
    before do
        @account = FactoryGirl.build(:account) # this does not save the object
    end

    describe "password is not present (on update)" do
        before do
            @account.save
            @account.name = 'updated without specifying the password field'
        end
        it "should be valid" do
            should be_valid
        end
    end
end

しかし、私はエラーで終わります:

   Account password is not present (on update) should be valid
      Failure/Error: should be_valid
        expected valid? to return true, got false
      # ./spec/models/account_spec.rb:48:in `block (3 levels) in <top (required)>'

before ブロックが他の多くのテストの前に実行され、モデルがメール フィールドの一意性を検証するため、FactoryGirl.create(:account) を使用できません。


初期の before ブロック内で FactoryGirl.create(:account) を使用すると (現在、シーケンス ジェネレーターを使用して一意の電子メール アドレスを作成しています)... このテストは失敗します。

describe "email is already taken" do
    before do
      same_user = @account.dup
      same_user.email = @account.email.upcase # let's test against case sensitive strings
      same_user.save
    end

    it { should_not be_valid }
  end

Account モデル内のいくつかの検証を次に示します。

 validates :name, :surname, presence: true
  validates :email, presence: true,
                    uniqueness: { case_sensitive: false },
                    format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
  validates :birthday, presence: true

  # Password validations
  validates :password, presence: true, :on => :create
  validates :password, length: { minimum: 4, maximum: 20 }, allow_blank: true
  validates :password_confirmation, presence: true, :unless => lambda { self.password.blank? }
4

1 に答える 1