1

次の制約で録音用のモデルを設定しています

class Recording < ActiveRecord::Base
  attr_accessible :agent_id, :confirmation, :filepath, :phone, :call_queue_id, :date
  belongs_to :call_queue

  PHONE_FORMAT = /^[0-9]+$|Unavailable/

  validates_presence_of :call_queue_id, :agent_id, :phone, :filepath, :date
  validates :phone, format: { with: PHONE_FORMAT }
end

次の仕様でテストしようとしています

describe Recording do
  let(:queue) { FactoryGirl.create(:call_queue) }
  before { @recording = queue.recordings.build(FactoryGirl.attributes_for(:recording)) }
  subject { @recording }

  # Stuff omitted...

  describe "phone" do
    it "should be present" do
      @recording.phone = ''
      @recording.should_not be_valid
    end

    context "with a valid format" do
      it "should only consist of digits" do
        @recording.phone = 'ab4k5s'
        @recording.should_not be_valid
      end

      it "should only match 'Unavailable'" do
        @recording.phone = 'Unavailable'
        @recording.should be_valid
      end
    end
  end  
end

最初の2つのテストは合格ですが、3番目のテストは次のように失敗します。

Failure/Error: @recording.should be_valid
   expected valid? to return true, got false

正規表現をrubularでテストして機能していることを確認してから、念のためにirbを再度使用しました。なぜこれが失敗するのか、私は本当に混乱しています。

編集:

beforerspecのステートメントを変更することで、最終的に仕様を渡すことができました。

describe Recording do
  let(:queue) { FactoryGirl.create(:call_queue) }
  before(:each) { @recording = queue.recordings.create(FactoryGirl.attributes_for(:recording) }
  # the rest is the same...

これは、ある意味で、最終的には私にとって理にかなっています。属性がレコードを無効にすると、それを再び変更できなくなったために、すべてが台無しになっていた理由(falseがtrueを返していた、またはその逆)でしたか?そうだったようです、確認したいだけです。

4

1 に答える 1

0

試す:

PHONE_FORMAT = /^([0-9]+|Unavailable)$/
于 2013-02-13T21:23:36.343 に答える