2016-02-27 3 views
0

Мой метод # # пользователя работает как ожидалось. При выполнении этого метода по запросу моего внешнего интерфейса происходит успешное обновление. Однако тест на этот метод терпит неудачу.Minitest не работает при тестировании обновлений пользователей

Для моего теста я регистрирую пользователя, а затем вернул возвращаемый auth_token в заголовки запроса.

Вот тест:

test "should successfully update valid email" do 
    old = @user.auth_token 
    post api_login_url, params: { session: @credentials } 
    @user.reload 
    assert_not_equal old, @user.auth_token 
    old_user = @user 
    @request.headers["Authorization"] = @user.auth_token 
    patch "/api/users/" + @user.id.to_s, params: { email: "[email protected]", password: "testtest" }, headers: @request.headers 
    assert_response 201 
    assert_equal "[email protected]", User.find(@user.id).email 
    end 

Ошибка:

Expected: "[email protected]" 
Actual: "[email protected]" 

В мой контроллер (@user уже установлен): before_action: authenticate_with_token !, только: [: обновление,: уничтожить ] before_action: set_user, only: [: show,: update,: destroy,: confirm,: posts,: comments] wrap_parameters: user, include: [: username,: email,: password,: password_confirmation]

def update 
    if @user.update(user_params) 
    render json: @user 
    else 
    render json: @user.errors, status: :unprocessable_entity 
    end 
end 

def user_params 
    params.require(:user).permit(:username, :email, :password, :password_confirmation, :confirmation_code, :confirmed) 
end 

Модель пользователя:

require 'json_web_token' 

class User < ApplicationRecord 
    before_save { email.downcase! } 
    before_create :generate_authentication_token! 
    before_update :reset_confirmed!, :if => :email_changed? 
    has_secure_password 
    has_many :posts 
    has_many :comments 
    has_many :votes 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } 
    validates :username, presence: true, length: { maximum: 24 }, uniqueness: { case_sensitive: false } 
    validates :password, presence: true, length: { minimum: 8 } 
    validates :auth_token, uniqueness: true 

    def generate_authentication_token! 
    begin 
     self.auth_token = JsonWebToken.encode('id' => self.id, 'username' => self.username) 
    end while self.class.exists?(auth_token: auth_token) 
    end 

    def destroy_token! 
    self.auth_token = nil 
    end 

    def reset_confirmed! 
    self.confirmed = false 
    end 
end 

В случае, если кто спросит, я попытался удалить before_update :reset_confirmed! вызов.

Я пробовал переписывать тесты разными способами. assert_response 201 не подводит.

Rails версии: 5.0.0.beta2

Рубин Версия: 2.2.3 (x86_64-darwin15)

+0

использовать отладчик и установить точку останова в методе обновления – Meier

ответ

1

Вам нужно обернуть Params:

patch "/api/users/" + @user.id.to_s, 
     params: { user: { email: "[email protected]", password: "testtest" }}, 
     headers: @request.headers 

Однако я весьма удивлен вы не получаете исключения (require(:user) должен поднять один, если params[:user] отсутствует), поэтому дайте мне знать, если он работает.

+0

К сожалению, он по-прежнему дает ту же ошибку. Я изначально был настроен таким образом, но не после нескольких попыток исправить эту вещь ... –

+1

Итак, давайте отлаживаем тогда. :) Добавьте 'raise 'hello" 'поверх вашего действия по обновлению и запустите свой тест. Мы ожидаем исключения. – BroiSatse

+0

Исключено исключение. –