0

Примечание: бизнес имеет множество каталогов и продуктов, а в каталоге много продуктов. Ассоциации правильно определены, и они работают в интерфейсе приложения. Но я не могу пройти этот тест. Я использую friendly_id так что вы будете видеть меня с помощью @ model.slug на некоторых из методов найтиRails Factory Girl RSpec Testing Has-Many Связь вложенных ресурсов

Я пытаюсь этот тест из:

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)>' 

Кроме того, этот блок кода будет также указать, что бизнес-модель не получила метод найти:

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

Какую ошибку вы получаете с Business.should_receive, тот же ожидаемый 1 раз, полученный 0 раз? –

ответ

1

Проблема здесь состоит в том, что переменная @catalog экземпляра вы настроены в спецификации, не совпадает с переменной экземпляра @catalog в контроллере.

@каталог в спецификации никогда не получит сообщений, отправленных на @catalog в контроллере.

Что вам нужно сделать, вместо того, чтобы изменить это в спецификации:

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

в

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

Заканчивать документации RSpec на any_instance.should_receive здесь: https://www.relishapp.com/rspec/rspec-mocks/v/2-6/docs/message-expectations/expect-a-message-on-any-instance-of-a-class

+0

awesome. обратите внимание, что эта строка: '@products = @ catalog.products.all' дала мне« неопределенный метод »all» для '. Удаление «.all» делает пробный проход – yretuta

+0

Хороший, рад, что вы его отсортировали. :) –

Смежные вопросы