Rails 5脚手架和Rspec测试控制器测试中的枚举

时间:2017-03-02 22:58:15

标签: ruby-on-rails rspec enums

我刚刚构建了一个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

那么我该如何测试这种情况?

1 个答案:

答案 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