2

失敗し続けるDealモデルの非常に単純なテストがあり、その理由がわかりません。

私の取引モデル:

class Deal < ActiveRecord::Base

belongs_to :admin_user, :foreign_key => 'admin_user_id'

attr_accessible :url_path,
              :country,
              :title,
              :description,
              :twitter_msg,
              :image_url,
              :prelaunch_date,
              :deal_launch_date,
              :deal_end_date,
              :featured,
              :admin_user_id
              :as => :admin_user

validates :title,
          presence: true,
          length: { maximum: 200 }  

テスト:

require 'spec_helper'

describe Deal do

let(:admin_user) { FactoryGirl.create(:admin_user) }

    before(:each) do
@attr = {
          url_path:    "lorem ipsum",
  country:     "France",
  title:       "lorem ipsum",
  description: "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum",
  twitter_msg: "lorem ipsum",
  image_url:   "lorem ipsum",
  prelaunch_date:     1.days.from_now.change(hour: 10),
  deal_launch_date:   3.days.from_now.change(hour: 10),
  deal_end_date:      15.days.from_now.change(hour: 10),
  featured:           true,
  admin_user_id: 1
}

終わり

describe "tests on deal models validations for TITLES" do
it { should validate_presence_of(:title) }
it { should_not allow_value(" ").for(:title) }

it "should reject deals with title that is too long" do
  long = "a" * 201
  hash = @attr.merge(:title => long)
  Deal.new(hash).should have(1).error_on(:title)
end    
end

テストは「TITLES の取引モデルの検証に関する取引テストは、長すぎるタイトルの取引を拒否する必要があります。失敗/エラー: Deal.new(hash).should have(1).error_on(:title) expected 1 error on : title, got 2 =>なぜエラーが 2 つあるのかわからない. 1 つだけを取得する必要があり、テストはパスするはずです!

最も奇妙なこと: -rspec spec失敗すると、検証で文字数を 195 に変更し、テストで 196 に変更すると、合格しますが、次にガードまたはサーバーを再起動すると、再び失敗し、190 と 191 に再度変更すると、再び機能しますが、ガードまたはサーバーを再起動するとすぐに

これを何度も試しましたが、いつも同じ問題です。わかりません。ガードかサーバーに問題があるようです。

なぜそれが起こるのか、どうすればこれを修正できるのか、誰にも手がかりがありますか?

4

2 に答える 2

4

shoulda マッチャーを使用して検証をテストできます。

it { should ensure_length_of(:title).is_at_most(200) }
于 2013-09-15T17:58:42.270 に答える