2016-08-27 7 views
0

RSpecがモデルサブクラスの検証をチェックできないRails 5セットアップがあります。コンソールにオブジェクトを手動で構築すると、レコードが有効でないようなエラーが表示されます。Rails:RSpecがモデルサブクラスの検証に失敗する

ベースモデル:

class Article < ApplicationRecord 
    belongs_to :author, class_name: User 

    validates :author, presence: { message: "L'utente autore dell'articolo è obbligatorio." } 
    validates :title, presence: { message: "Il titolo dell'articolo è obbligatorio." } 
end 

条から継承モデル:

class LongArticle < Article 
    mount_uploader :thumbnail, LongArticleThumbnailUploader 

    validates :excerpt, presence: { message: "L'estratto dell'articolo è obbligatorio." } 
    validates :thumbnail, presence: { message: "L'immagine di anteprima dell'articolo è obbligatoria." } 
end 

工場これらのモデルの(FactoryGirl):

FactoryGirl.define do 
    factory :article do 
     association :author, factory: :author 
     title "Giacomo Puccini: Tosca" 

     factory :long_article do 
      type "LongArticle" 
      excerpt "<p>Teatro alla Scala: immenso Franco Corelli.</p>" 
      thumbnail { Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec', 'support', 'images', 'unresized-long-article-thumbnail.jpg')) } 
     end 
    end 
end 

これは動作しませんRSpecのです:

require 'rails_helper' 

RSpec.describe LongArticle, type: :model do 

    describe "is valid with mandatory fields" do 
    it "should be valid with if all mandatory fields are filled" do 
     article = FactoryGirl.create(:long_article) 
     expect(article).to be_valid 
    end 

    it "should have an excerpt" do 
     article = FactoryGirl.create(:long_article) 
     article.excerpt = nil 
     expect(article).not_to be_valid 
    end 
    it "should have the thumbnail" do 
     article = FactoryGirl.create(:long_article) 
     article.thumbnail = nil 
     expect(article).not_to be_valid 
    end 
    end 

end 

最初のスペックパス、他の2つはありません。 同じ値でコンソールのすべてをテストしようとしましたが、それは動作します。つまり、レコードが無効であるはずです。

RSpecでサブクラスの検証が機能しない可能性はありますか?

+1

あなたが理解している間、簡単に検証をテストするためにhttps://github.com/thoughtbot/shoulda-matchersをチェックすることをお勧めします。 – juanitofatas

+1

また、デバッガやbiding.pryを使って仕様に 'article.valid?'を手動で実行して、その理由を調べることもできます。 – juanitofatas

答えて

0

私は遅れて申し訳ありませんが、私は何が私のテストを壊していたかを考え出したと思います。

問題は、実際には私が当初思ったように2つで、1つではありませんでした。

最初のテスト:should have an excerpt

juanitofatasによって示唆されるように、私がfactorygirlが私のモデルを構築した後、1 byebug行を追加しています。私はインスタンス化されたモデルがクラスArticleであり、LongArticleではないことに気付きました。

FactoryGirlが最初にfactory :article doと出会ったときに、FactoryGirlがベースファクトリのモデルをインスタンス化することに気付きました。次に、内部ファクトリに定義された属性を追加または上書きし、type属性を他のものとして扱い、STIを駆動することは無視します。

LongArticleファクトリは、Articleと同じレベルで全く異なるモデルとして定義されている必要があります。

第二のテスト:should have the thumbnail

これは少し愚かだった...私は実際には、これは望ましい動作である、CarrierWaveアップローダーでdefault_urlメソッドを定義しています。テストが更新されました。

関連する問題