Rspec 控制器规范返回未定义的方法"where"



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

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

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

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 - (working):

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(模型):

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

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

您可以在另一个模块中命名模型,如另一个答案所建议的,或将模型重命名为其他东西,如Zipcode

这样做:

  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

然后试试上面的代码

最新更新