Mi prueba de RSpec falló, pero no pude averiguar cómo podría solucionarlo. Llamando al método .all en el pase de clase pero falla con las asociaciones.

Mensaje de error

  0) CustomerDetail #index when logged in should render customer details index page
     Failure/Error: @customer_details = current_shop.customer_details.load

     NoMethodError:
       undefined method `customer_details' for nil:NilClass
     # ./app/controllers/customer_details_controller.rb:9:in `index'

ApplicationController

class ApplicationController < ActionController::Base
  layout 'embedded_app'

  def current_shop
    @current_shop ||= Shop.find_by(shopify_domain: cookies[:shopify_domain])
  end
end

Aquí está el controlador

class CustomerDetailsController < ApplicationController
  before_action :authenticate_user!

  def index
    # This failed the test below and complains that NoMethodError: undefined method 'customer_details' for nil:NilClass
    @customer_details = current_shop.customer_details.load

    #This pass the test below
    @customer_details = CustomerDetail.all.load
  end
end

Modelos

class Shop < ActiveRecord::Base
  include ShopifyApp::SessionStorage

  has_many :customer_details

  def api_version
    ShopifyApp.configuration.api_version
  end
end

class CustomerDetail < ApplicationRecord
  belongs_to :shop
end

RSpec

context 'when logged in' do
  before do
    @shop = create(:shop)
    @user = create(:user)
    sign_in @user
  end

  it 'should return a 200 response' do
    get customer_details_index_path
    expect(response).to have_http_status '200'
  end

  it 'should render customer details index page' do
     get customer_details_index_path
     expect(response).to render_template(:index)
  end
end

Cualquier ayuda será apreciada.

0
Afolabi Olaoluwa Akinwumi 26 nov. 2019 a las 16:22

1 respuesta

La mejor respuesta

current_shop está nil en su controlador. No es suficiente que establezca shop en su código de especificación. Las variables de instancia de las especificaciones no se comparten con un controlador bajo prueba.

Asegúrese de que la tienda en la que está creando

    @shop = create(:shop)

Tiene el campo shopify_domain establecido en cualquier valor que tenga cookies[:shopify_domain] en su solicitud de prueba.

3
mrzasa 26 nov. 2019 a las 13:25