尝试在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
答案 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
然后尝试上面的代码。