2

私は FactoryGirl を使用して、Rails 関連の gem の日付ディメンション モデルのインスタンスを作成しています。私の工場は次のようになります。

FactoryGirl.define do
  sequence :next_day do |n|
    Date.new(2000,12,31) + n.days
  end

  factory :date_dimension do
    the_date = FactoryGirl.generate(:next_day)
    date {the_date.to_s}
    calendar_year {the_date.strftime("%Y")}
    (...other attributes created similarly to calendar_year)
  end

end

欲求不満から、実際に何が機能していないかを示す小さなテストを作成しました。

describe "working date factories" do
  before(:all) do
    @date_dimension = FactoryGirl.create(:date_dimension)
    @jan_two = FactoryGirl.create(:date_dimension)
  end

  describe "sequence incrementing" do
    it "returns a date dimension object ok" do
      @date_dimension.date.should == "2001-01-01"
    end
    it "returns the next date in the sequence" do
      @jan_two.date.should == "2001-01-02"
    end
  end
end

そのテストを実行すると、次のようになります。

working date factories
  sequence incrementing
    returns a date dimension object ok
    returns the next date in the sequence (FAILED - 1)

Failures:

  1) working date factories sequence incrementing returns the next date in the sequence
     Failure/Error: @jan_two.date.should == "2001-01-02"
       expected: "2001-01-02"
            got: "2001-01-01" (using ==)

シーケンスに関連する他の多くの質問を読みましたが、そこで特定された間違いを犯しているようには見えません。それは別の(おそらくばかげた)間違いです。それは何ですか?

4

1 に答える 1

1

私は最終的に機能するアプローチを見つけましたが、とにかく少し優れているでしょう。上記のコードが機能しない理由をまだ理解していません-誰かが私にそれを説明できる場合(おそらくドキュメントまたはソースコードの一部を参照して)、先に進んでその答えを受け入れます-この投稿フォローしてくださった方限定です。うまくいったのは次のとおりです。

FactoryGirl.define do

  factory :date_dimension do
    sequence(:date) { |n| (Date.new(2000,12,31) + n.days).to_s }
    calendar_year { Date.parse(date).strftime("%Y") }
    day_of_week { Date.parse(date).strftime("%A") }
  end

end

上記のコードは次のテストに合格します。

describe "working date factories" do
  before(:all) do
    @date_dimension = FactoryGirl.create(:date_dimension)
    @jan_two = FactoryGirl.create(:date_dimension)
  end

  describe "sequences" do
    it "returns the proper first date in the sequence" do
      @date_dimension.date.should == "2001-01-01"
      @date_dimension.calendar_year.should == "2001"
      @date_dimension.day_of_week.should == "Monday"
    end
    it "returns the next date in the sequence" do
      @jan_two.date.should == "2001-01-02"
      @jan_two.calendar_year.should == "2001"
      @jan_two.day_of_week.should == "Tuesday"
    end
  end
end
于 2012-06-21T17:04:35.530 に答える