0

注: ビジネスには多くのカタログと製品があり、カタログには多くの製品があります。アソシエーションは適切に定義されており、アプリケーション フロント エンドで機能しています。しかし、私はこのテストに合格することはできません。私は Friendly_id を使用しているため、いくつかの検索メソッドで @model.slug を使用していることがわかります。

私はこのテストを試しています:

describe "GET 'show'" do
  before do
    @business = FactoryGirl.create(:business)
    @catalog = FactoryGirl.create(:catalog, :business=>@business)
    @product1 = FactoryGirl.create(:product, :business=>@business, :catalog=>@catalog)
    @product2 = FactoryGirl.create(:product, :business=>@business, :catalog=>@catalog)
  end

  def do_show
    get :show, :business_id=>@business.slug, :id=>@catalog.slug
  end

  it "should show products" do
    @catalog.should_receive(:products).and_return([@product1, @product2])
    do_show
  end
end

このファクトリを使用します (ビジネスおよびカタログ ファクトリは別の場所で定義されており、それらは関連付けであることに注意してください):

FactoryGirl.define do
  sequence :name do |n|
    "product#{n}"
  end

  sequence :description do |n|
    "This is description #{n}"
  end

  factory :product do
    name
    description
    business
    catalog
  end
end

この表示アクションで:

def show
    @business = Business.find(params[:business_id])
    @catalog = @business.catalogs.find(params[:id])
    @products = @catalog.products.all
    respond_with(@business, @catalog)
  end

しかし、私はこのエラーが発生しています:

CatalogsController GET 'show' should show products
     Failure/Error: @catalog.should_receive(:products).and_return([@product1, @product2])
       (#<Catalog:0x000001016185d0>).products(any args)
           expected: 1 time
           received: 0 times
     # ./spec/controllers/catalogs_controller_spec.rb:36:in `block (3 levels) in <top (required)>'

さらに、このコード ブロックは、ビジネス モデルが find メソッドを受け取っていないことも示しています。

Business.should_receive(:find).with(@business.slug).and_return(@business)
4

1 に答える 1

1

ここでの問題は、スペックで設定した @catalog インスタンス変数がコントローラーの @catalog インスタンス変数と同じではないことです。

仕様の @catalog は、コントローラーの @catalog に送信されたメッセージを受信しません。

代わりに、仕様でこれを変更する必要があります。

@catalog.should_receive(:products).and_return([@product1, @product2])

Catalog.any_instance.should_receive(:products).and_return([@product1, @product2])

ここで any_instance.should_receive に関する RSpec ドキュメントを確認してください: https://www.relishapp.com/rspec/rspec-mocks/v/2-6/docs/message-expectations/expect-a-message-on-any-instance -クラスの

于 2012-06-21T06:49:55.733 に答える