2014-10-17 2 views
1

Я использую rspec + FactoryGirl для тестирования своего приложения.rspec тест для уничтожения, если пользователь не существует

У меня есть следующий тест

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: @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 ...)

Если второй вопрос неверен, я думаю, что моя жизнь будет проще.

ответ

1

Эта часть теста:

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

предполагает что @user будет присвоен идентификатор 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 

В реальном мире, возможно, бывают ситуации, когда пользователь может быть уничтожены, и в этом случае вам потребуется какая-то логика в вашем контроллер.

+0

Это решение будет только для прохождения теста? – rogelio

+0

Возможно, немного поздно, но тест проходит, когда я это делаю. Благодаря! – rogelio

+0

Добро пожаловать, рад, что это помогло! –

Смежные вопросы