我剛剛構建了一個Rails 5新應用程序--api。我搭建了一個模型並添加了一個枚舉。Rails 5腳手架和Rspec控制器測試enum測試
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
但是測試d oes不起作用,因爲如果您傳遞了無效的枚舉,則無法創建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
那麼,如何測試這個方案?
這是不可能的'create'對象,但你可以實例化它...使用'.new'然後'#update_attributes'(或'#'save'#assign_attributes')。你可以顯示你的控制器創建代碼? – SteveTurczyn
謝謝,我添加了控制器代碼。我猜測誰寫腳手架測試沒有考慮這個邊緣案例。 – rmcsharry
我不知道如何解釋我的意思 - 但腳手架測試設置爲使用「有效」和「無效」屬性......這裏的含義是爲了測試驗證(如validates_presence_of)。枚舉不使用validates_presence_of,所以這就是我稱之爲邊緣情況的原因。我想我必須寫一些其他類型的測試,但我不知道什麼,感嘆。 :( – rmcsharry