无法为请求工作制作rails规范:`undefined方法'调用'用于#<app:`

时间:2015-05-26 10:16:06

标签: ruby-on-rails rspec rspec-rails

=“”

我正在尝试制作规范在一个项目上工作。有一个规格设置,但没有维护。

我有request spec

的简单帖子
require 'rails_helper'

RSpec.describe 'Cars API', type: :request do
  let(:organization) { Fabricate(:organization, owner: user) }
  let(:app)          { Fabricate(:app, organization: organization, owner: user) }
  let(:user)         { Fabricate(:user) }

  before do
    #login_api(user)
  end

  describe 'create' do
    describe 'car type' do
      it 'should create a car of type CarType1' do
        expect(Car.count).to eql(0)
        id = '123'
        post("/api/1/organization/#{id}/cars")
        expect(Car.count).to eql(1)

        car = Car.first

        expect(car.type).to eql(Car::CarType1)
      end
    end
  end
end

我得到了

#<NoMethodError: undefined method `call' for #<App:0x007fee64557080>>

我试图调试这个问题,但没有运气。 问题发生在post("/api/1/organization/#{id}/cars")行。 问题可能在哪里?

2 个答案:

答案 0 :(得分:2)

我有这样的问题;)(花了几个小时来调试源代码)

尝试将app重命名为ap或类似变量。

# "bad" name
let(:app)          { ... }

# "better" name
let(:ap)          { ... }
# or 
let(:my_app)      { ... }

当RSpec初始化您的惰性块let时,我理解变量名中的问题。不确定,但我认为当时App已初始化,RSpec发送方法call不会阻止let,而是阻止另一个对象。

注意:您可以在阻止之前使用并使用实例变量@app

答案 1 :(得分:2)

发生此问题是因为您要覆盖Rails app变量。将变量重命名为其他内容。它会起作用。

默认情况下,在rails中,app变量是您的Rails应用程序,它具有call方法,只要您的应用程序收到来自Rack中间件的任何请求,就会调用该方法。