1

私はデイリー ディール レール アプリを構築しており、M. Hartl チュートリアルに従っていくつかの rspec テストを設定しました。

ユーザーにとって、それらは完全に機能します。

しかし今、私はそれをモデル Eals に使用しており、すべてが合格すべきではないときに合格しています。たとえば、私のモデルでは、タイトルは 200 文字を超えないようにしています (注: 私の見解では、これより長いタイトルを設定しようとすると、機能し、不可能であると警告されます)。

しかし、タイトル テストで long = "a" * 50、a * 201、または * 10000 を使用してタイトル文字の長さのテストを試みても、テストを行うと、常に合格します。私が見つけることができない大きな問題があります。実際、他のすべてのテストには同じ問題があります。それらは常にパスします。

これが私のmodels/deal.rbです

class Deal < ActiveRecord::Base

 belongs_to :admin_user

 attr_accessible :url_path, 
                 :country, 
                 :title,
                 :description,
                 :twitter_msg,
                 :admin_user_id

 validates :url_path,
          presence: true,
          uniqueness: { :case_sensitive => false }
 validates :country, 
          :inclusion => {  :in => ['France', 'Germany', 'United States'],
                           :message => "%{value} is not a valid country. " }
 validates :title,
          presence: true,
          length: { maximum: 200, 
                    :message => "Your title has %{value} characters but must be shorter than 200 characters" }  
validates :description,
          presence: true,
          length: { maximum: 500,
                    :message => "Your title has %{value} characters but must be shorter than 500 characters" } 
validates :twitter_msg,
         presence: true,
         uniqueness: { :case_sensitive => false }


validates :admin_user_id, presence: true

そして私の deal_spec.rb:

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",
                    twitter_msg:"lorem ipsum",
                                     }
end

it { should respond_to(:url_path) }
it { should respond_to(:country) }
it { should respond_to(:title) }
it { should respond_to(:description) }
it { should respond_to(:twitter_msg) }

describe "title test" do

it "should reject deals with title that is too long" do
  long = "a" * 50
  hash = @attr.merge(:title => long)
  Deal.new(hash).should_not be_valid
end

[other tests] 

 end #end of title test

誰かがそれを理解するのを手伝ってくれるなら、それは素晴らしいことです.私は何の手がかりもなく何時間も過ごしてきました.

sbのアドバイスに従った後、テストを次のように変更しました

Deal.new(hash).should have(1).error_on(:title)

    describe "test" do

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

しかし、今では常に通過しています。つまり、 long= "a" * 5, long="a" * 300... を入力しても、タイトルにエラーが1つあることがわかります...

4

4 に答える 4

4

オブジェクトが無効である理由がわからないため、これは RSpec を使用して検証をテストする正しい方法ではありません。テストしている属性とはまったく異なる属性が欠落しているため、無効である可能性があります。have(x).errors_on(y)アサーションを使用する必要があります:

Deal.new(hash).should have(1).error_on(:title)
于 2013-09-11T19:29:13.193 に答える