【问题标题】:Rspec controller spec returning undefined method 'where'Rspec 控制器规范返回未定义的方法'where'
【发布时间】:2015-09-30 03:47:50
【问题描述】:

尝试在我命名为“API::ZipsController”的 Rails 控制器上使用 rspec 构建控制器规范。

控制器接受名为“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 -(工作):

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

【问题讨论】:

  • 您的规范中没有遗漏要求吗?
  • @moeabdol 是的,编辑了我上面的代码帖子以包含“spec_helper”。它一直在我的代码中。
  • 你能显示 Zip 类吗?
  • 其实哪里是类方法!你能显示 Zip 类吗?
  • @moeabdol 将 zip 类添加到上面的帖子中。它只是用于超级 as_json 定义。我尝试使用“find”而不是 where 但得到错误 'ActiveRecord::RecordNotFound (Couldn't find Zip with 'id'={:zip_code=>"V9A"})' 因为它试图通过 id 找到它,我需要通过 zip_code 列找到“哪里”似乎适用的地方

标签: ruby-on-rails ruby rspec


【解决方案1】:

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

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

【讨论】:

  • 哈!我不相信.. 我的 gemfile.lock 中确实有 ruby​​zip gem .. 一定是某些东西的依赖。我将我的 Zip 模型重命名为 Zipcode,一切似乎都正常。谢谢!!!
【解决方案2】:

这样做:

  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

然后,试试上面的代码。

【讨论】:

  • 不确定我会这么快就拿到一个模拟。鉴于该错误是 Zip:Module 的未定义方法,我怀疑 OP 在某处定义了 API::Zip 模块,这只会使测试通过而无需修复任何东西。
  • 让我们等待他的回应。然后,基于此,我可以更新我的答案。
  • @KMRakibulIslam 谢谢你的回答,不幸的是这没有用。仍然返回“Zip:Module 的未定义方法 'where'”。
  • @ihaztehcodez 我不确定“Zip:Module”是什么意思,因为我只是在一个文件中将它定义为 Rails 控制器中的 API::ZipsController。
  • @KMRakibulIslam 嗯,我现在收到错误 Failure/Error: allow(Zip).to receive(:where).with(zip_code) { zip } Zip does not implement: where
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多