Rspec控制器规范返回未定义的方法'其中'

时间:2015-09-30 03:47:50

标签: ruby-on-rails ruby rspec

尝试在rails控制器上使用rspec构建控制器规范我命名为" API :: ZipsController"。

控制器接受一个名为" zip_code"的参数。并返回一个活动记录模型和200状态。

但是,当我运行rspec时,测试会因NoMethodError: undefined method 'where' for Zip:Module而失败。我相信这是因为'其中'是一个实例方法,而不是类方法所以我需要存根/模拟它?不幸的是,到目前为止我还没有解决问题的运气。

zips_controller_spec.rb:

describe API::ZipsController do
require 'spec_helper'
it "returns 200 status with zones data" do
        get 'show', zip_code: "V9A1B2"
        response.should be_success
  end
end

api / zips_controller.rb - (工作):

class API::ZipsController < ApplicationController
  def show
    zip = Zip.where(zip_code: params[:zip_code].upcase.slice(0..2))
    render json: zip, status: 200
  end
end

zip.rb(model):

class Zip < ActiveRecord::Base
def as_json(options)
super(:only => [:zip_code])
end
end

2 个答案:

答案 0 :(得分:2)

您的Zip模块已定义某处与您的Zip模型冲突。它可能在你的代码中的某个地方,或者像使用rubyzip gem一样棘手。

您可以按照另一个答案中的建议将模型命名为另一个模块,或者将模型重命名为Zipcode之类的其他模块。

答案 1 :(得分:1)

这样做:

  require 'spec_helper'

  describe API::ZipsController, type: :controller do
    let(:zip_code) { "V9A1B2" }
    let(:params) { { zip_code: zip_code } }
    let(:zip) { double('zip') }

    before do
      allow(Api::Zip).to receive(:where).with(zip_code) { zip }
    end

    it "returns 200 status with zones data" do
      get 'show', params
      response.should be_success
    end
  end

更新

尝试将Zip课程放在一个模块下,说Api并将其放在app/models/api/zip.rb文件下:

module Api
  class Zip < ActiveRecord::Base
    def as_json(options)
      super(:only => [:zip_code])
    end
  end
end

然后尝试上面的代码。