【问题标题】:rspec test for destroy if user doesn't exist如果用户不存在,则 rspec 测试销毁
【发布时间】:2014-10-17 17:11:50
【问题描述】:

我正在使用 rspec + FactoryGirl 来测试我的应用。

我有下一个测试

context "user cannot be destroyed" do
  before(:each) do
    @user = FactoryGirl.create :user
    delete :destroy, {id: 1}, format: :json
  end
  it "render the json error when the user is not destroyed" do
    user_response = JSON(response.body, symbolize_names: true)
    expect(user_response[:errors][:message]).to include "User cannot be destroyed"
  end
  it {should respond_with 422}
end

当我运行测试时,我收到错误Couldn't find User with 'id'=1 两次。如果我更改 id {id: @user.id} 测试没有通过,我会得到下一个错误。

undefined method `[]' for nil:NilClass

Expected response to be a 422, but was 204

我测试的代码是

def destroy
  user = User.find(params[:id])

  if user.destroy
    render json: {success: {:message => "User destroyed"} }, status: 204
  else
    render json: {errors: {:message => "User cannot be destroyed"} }, status: 422
  end
end

所以,我有两个问题:

  1. 我该如何解决这个问题?
  2. 是否需要检查用户是否已被销毁? (如果 user.destroy ...)

如果第二个问题是假的,我想我的生活会更轻松。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rspec factory-bot


    【解决方案1】:

    这部分测试:

    @user = FactoryGirl.create :user
    delete :destroy, {id: 1}, format: :json
    

    假设 @user 将被分配 id 1。这不是一个安全的假设。您将这一行更改为:

    delete :destroy, {id: @user.id}, format: :json
    

    更改后,您说测试失败:

    Expected response to be a 422, but was 204
    

    表示用户销毁了。

    最简单的解决方案是更改您的控制器:

    def destroy
      user = User.find(params[:id])
      render json: {errors: {:message => "User cannot be destroyed"} }, status: 422
    end
    

    在现实世界中,可能存在用户被销毁的情况,在这种情况下,您需要在控制器中添加一些逻辑。

    【讨论】:

    • 这个解决方案只是为了通过测试?
    • 可能有点晚了,但是当我这样做时测试通过了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多