我刚刚构建了一个Rails 5新应用程序--api。我搭建了一个模型,并添加了一个枚举。
class Track < ApplicationRecord
enum surface_type: [:asphalt, :gravel, :snow], _prefix: true
end
其中一个脚手架控制器测试如下:
context "with invalid params" do
it "assigns a newly created but unsaved track as @track" do
post :create, params: {track: invalid_attributes}, session: valid_session
expect(assigns(:track)).to be_a_new(Track)
end
end
我在顶部添加了无效的属性:
let(:invalid_attributes) {{
"name": "Brands Hatch",
"surface_type": "wood"
}}
并将期望行更改为此
expect(assigns(:track)).not_to be_valid
但测试不起作用,因为如果传递无效的枚举,则无法创建Track对象。
控制器操作:
def create
@track = Track.new(track_params)
if @track.save
render json: @track, status: :created
else
render json: @track.errors, status: :unprocessable_entity
end
end
那么我该如何测试这种情况?
答案 0 :(得分:2)
通过正常验证可以捕获无效:surface_type
的一种方法是拦截分配。
class Track < ApplicationRecord
enum surface_type: [:asphalt, :gravel, :snow], _prefix: true
attr_accessor :bad_surface_type
validate :check_surface_type
def surface_type=(surface)
super surface
rescue
self.bad_surface_type = surface
super nil
end
private
def check_surface_type
errors.add(:surface_type, "the value #{bad_surface_type} is not valid") if bad_surface_type
end
end