0

コードにさらに多くのテストを組み込もうとしていますが、壁にぶつかっています。

私のモデルは次のようになります

class Image < ActiveRecord:Base
  before_create :do_something_general
  before_update :do_something_on_update, :do_something_general

  belongs_to :captureable, polymorphic: true

  mount_uploader :image, SomeUploader
  ...
end

私のrspecは次のようになります

describe SomeModel do
  before :each do
     @image = FactoryGirl.create(:image)
  end
  ...
  describe "moving image" do
     context "change the parent of the image" do
         it "moves" do
            new_parent = FactoryGirl.create(:parent)
            current_file_path = @image.image.file.path
            @image.captureable = new_parent
            @image.save!
            @image.image.file.path.should_not == current_file_path
         end
      end
  end
end

Image を最初に作成すると、その親に依存するファイル ツリー構造に格納されます。親が変更されると、画像を移動する必要があり、これは before_update コールバック :do_something_on_update で行われます。私のテストでは、イメージの親が変更されたときに、イメージが新しい場所にあることを確認する必要があります。

問題は、@image.save.should be_valid:do_something_on_update の前に :do_something_general が実行されるため、except が返される場合です (順序が重要です)。rspec は、私が新しいオブジェクトを作成していると考えているようです (デバッガーを使用して、変更時にオブジェクト ID が変更されないことを確認しました)。したがって、before_update の代わりに before_create を実行します。

編集: before_update は機能しているようですが、モジュールではなくクラス内にあるコールバック メソッドでのみ機能しています。この場合、:do_something_on_update はインクルード モジュールにあります。編集を終了

開発モードのコンソールでこれを試すと、期待どおりに動作します。

その他の注意事項: アップロードに Carrierwave を使用しています (画像列は Carrierwave アップローダーです)。:image ファクトリが呼び出されると、いくつかの親オブジェクトと祖父母オブジェクトも作成されます。Rspec 2.10、Rails 3.2.8、Ruby 1.9.3 を使用

あなたの応答を楽しみにしています。

ありがとう。

4

1 に答える 1

0

true または false を返す invoke が実行され、そのブール値の結果が呼び出さimage.save.should be_validれるため、失敗することが予想されますが、これは失敗する可能性があります。image.save#valid?

次のようにテストを書くことを検討してください。

describe SomeModel do
  let(:image) { FactoryGirl.create(:image) }

  context "when changing the parent of the image" do
    let(:parent_change) { lambda {
      image.captureable = FactoryGirl.create(:parent)
      image.save!
    } }

    it "updates the image's path" do
      expect parent_change.to change { image.image.file.path }
    end
  end
end

これにより、テストでアサーションが 1 つだけ (ファイル パスが変更されていること) になり、保存が失敗した場合は代わりに例外が発生することが保証されます。

于 2012-11-30T00:09:51.350 に答える