2015-06-22 2 views
2

"User.count" didn't change by 1 значит и как исправить? Ниже приведена командная строка с консоли."User.count" не изменился на 1 - Rails

Вот ошибки, которые я получил от bundle exec rake test и я ищу способ, чтобы исправить их:

$ bundle exec rake test 
Run options: --seed 210 

# Running: 

.....F...F.. 

Finished in 1.084264s, 11.0674 runs/s, 13.8343 assertions/s. 

    1) Failure: 
UsersControllerTest#test_should_create_user [app/test/control 
lers/users_controller_test.rb:20]: 
"User.count" didn't change by 1. 
Expected: 3 
    Actual: 2 


    2) Failure: 
UsersControllerTest#test_should_update_user [app/test/control 
lers/users_controller_test.rb:39]: 
Expected response to be a <redirect>, but was <200> 

12 runs, 15 assertions, 2 failures, 0 errors, 0 skips 

И Кроме того, что это "Expected response to be a <redirect>, but was <200>" значит?

И код ниже, что я работать в этом тесте:

Ниже линии 39 в users_controller_test.rb

37 test "should update user" do 
    38  patch :update, id: @user, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
    39  assert_redirected_to user_path(assigns(:user)) 
    40 end 

А вот код в контроллер. Для 1), ниже линии 20 в users_controller_test.rb

19 test "should create user" do 
    20  assert_difference('User.count') do 
    21  post :create, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
    22  end 

Ниже то, что мой users_controller#update выглядит

def update 
    respond_to do |format| 
    if @user.update(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 
    else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Pre Условие:

Я добавил электронную почту позже я создал свою первоначальную модель пользователя, следуя учебнику YouTube Джонатана Макдональда «Как установить Ruby on Rails в Windows 7 - Часть 4, Ruby o п Rails» процесса, начиная с 11:00

$ rails generate scaffold user first_name:string last_name:string 
$ rake db:migrate 

А потом после игры вокруг в песочнице консоли немного, я добавил значение электронной почты в моей модели пользователя с помощью следующего процесса в 6.3.1 хешированного пароля от электронной книги railstutorial ORG в:

Оригинал команды:

$ rails generate migration add_password_digest_to_users password_digest:string 
My command to add email value in my user model: 
$ rails generate migration add_email_to_users email:string 
$ rake db:migarate 

, а затем я обновить следующие файлы:

Контроллеры

1) 'MyApp'/приложение/контроллеры/users_controller.rb [добавить: электронная почта в разрешении()]

def user_params 
    params.require(:user).permit(:first_name, :last_name, :email) 
end 

2) «MyApp/test/controllers/users_controller_test.rb ' [добавить адрес электронной почты: @ user.email в' test 'должен создать пользователя «do» и «test» должен обновить пользователя «do»]

test "should create user" do 
    assert_difference('User.count') do 
    post :create, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
end 
# ... 
test "should update user" do 
    patch :update, id: @user, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
    assert_redirected_to user_path(assigns(:user)) 
end 

Модели

1) 'MYAPP'/приложение/модели/пользователь.гь [добавить validaates для электронной почты по добавьте эту строку]

validates :email, presence: true, length: { maximum: 255 } 

2) 'MyApp'/тест/modles/user_test.rb [добавить значение электронной почты в определении настройки пользователя]

def setup 
    @user = User.new(first_name: "Example", last_name:"User", email: "[email protected]") 
end 

[add email validation tasks] 

    test "email should be present" do 
     @user.email = "  " 
     assert_not @user.valid? 
    end 
    test "email should not be too long" do 
     @user.email = "a" * 244 + "@example.com" 
     assert_not @user.valid? 
    end 

Просмотров

1) «myap р '/ приложение/просмотров/пользователей/_form.html.erb [добавить поле для электронной почты]

<div class="field"> 
    <%= f.label :email %><br> 
    <%= f.text_field :email %> 
</div> 

2) 'MyApp'/ приложение/просмотров/пользователей/index.html.erb [ добавить адрес электронной coulmn в таблице]

<td> 
    <%= user.email %> 
</td> 

3) 'MyApp'/приложение/просмотров/пользователей/show.html.erb [добавить адрес электронной раздел в пунктах]

<p> 
    <strong>email:</strong> 
    <%= @user.email %> 
</p> 

И затем, когда я бегу bundle exec rake test, я столкнулся с этой ошибкой, о которой я спросил.

Существует файл под названием users.yml, и я не думал, что это актуально в начале. Но на самом деле это было вызвано этими неудачами. Поэтому в своем ответе я ссылаюсь на код в этом файле. Я просто не говорю об этом здесь, в моем разделе вопросов, для простоты.

+0

Вы не указали нам код контроллера, который вызвал бы эти сбои. Достаточно сказать, что допущения, изложенные в тесте, не будут реализованы фактическим контроллером, но трудно сделать вывод, почему, не видя сам контроллер. – Makoto

+0

Проверьте журнал/тест.файл журнала – Axxiss

+0

Не могли бы вы предоставить нам все соответствующие коды ваших пользовательских тестов - это включает в себя код, который устанавливает переменную '@ user' (в ваших тестах, а не в контроллере)? Также покажите нам свою модель пользователя (чтобы мы знали, какие проверки есть). Наиболее вероятная проблема заключается в том, что по какой-то причине вы отказываетесь от валидации, поэтому пользователь не создается ... но для нас нужно проверить, что нам нужно знать, какую информацию вы используете, и какие проверки ожидаются. –

ответ

7

Эти неудачи были вызваны атрибутом электронной почты отсутствует в «MYAPP/тест/светильники/users.yml» а атрибут электронной почты был добавлен в производстве среда позже.Я создал исходную модель пользователя с 'first_name' и 'last_name' без 'email', как я описал в шагах в моем вопросе.

Существует множество команд, которые помогают добавлять атрибуты в связанные файлы для вновь добавленного атрибута после его первоначального создания. Но я добавил атрибуты в связанных файлах вручную, как вы можете видеть в нижнем коде.

'MyApp/тест/приборы/users.yml'

Оригинал:

one: 
    first_name: MyString 
    last_name: MyString 
two: 
    first_name: MyString 
    last_name: MyString 

Update:

one: 
    first_name: MyString 
    last_name: MyString 
    email: MyString 
two: 
    first_name: MyString 
    last_name: MyString 
    email: MyString 

Затем запустите

$ bundle exec rake test 
    Run options: --seed 1540 

    # Running: 

    ............... 

    Finished in 2.383035s, 6.2945 runs/s, 8.8123 assertions/s. 

    15 runs, 21 assertions, 0 failures, 0 errors, 0 skips 


Однако я суммированы значения «1» и «200» в списке внизу.

[Какая доза «1» означает]
Чтобы понять, что это число '1' означает, что вам нужно прочитать следующие пару строк

Expected: 3 
    Actual: 2 

Он говорит ожидается 3, но на самом деле 2. Существует только 2 атрибут 'first_name' и 'last_name' в «MYAPP/тест/светильники/users.yml» на попрошайничество в то время как предполагают, чтобы иметь 3 атрибут, который 'first_name', 'last_name' и 'email' то я предполагаю, что это сообщение упоминалось о количестве отсутствующих атрибутов в «MYAPP/тест/светильники/users.yml», потянув за номер '1' ..

[Ответ на «200»]
Я думал, что это число имеет также уникальные значения, связанные с исходным кодом вместо кода состояния HTTP. Это фактически код состояния HTTP. Код '200' означает «ОК», как вы можете видеть по ссылке ниже.

10.2.1 200 OK

Запрос удалось. Информация, возвращаемая с ответом зависит от метода, используемого в запросе ...

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Это говорит ожидаемый отклик будет перенаправлять вместо того, чтобы просто пошел кап.

2

Вероятно, это означает, что контроллер возвращает ошибку. Вероятно, вы можете увидеть ошибку, сбросив содержимое assigns(:user).errors. Pry или другой REPL. В противном случае puts assigns(:user).errors.inspect должен работать.

+0

Вышеупомянутая фантастическая команда (ставит одну). Какой класс присваивает return, у которого есть метод «ошибок»? Также как вы определяете классы и методы в Rails? – Richard

+2

'assigns (: user)' просто возвращает переменную класса ('@ user') в контроллере. В этом конкретном случае '@ user' был назначен экземпляром объекта ActiveRecord. ActiveRecord извлекает экземпляр ActiveModel :: Errors и делает его доступным с помощью метода '# errors'. –

+0

@will_in_wi Могу ли я проводить проверки изнутри PRY? Я пытаюсь понять, если я делаю это неправильно или просто преследую неправильное дерево. – Mirv

-1
  1. Пользователь должен быть создан, но это не так. Множество возможных причин, т. Е. Дублировать электронную почту.
  2. Ваш тест ожидает перенаправления после редактирования пользователя, но рельсы просто отображают некоторую страницу. У вас есть redirect_to @user в users_controller#update?
5

Невозможно увеличить показатель User.count и рендера < 200> по той же причине ... вы не можете создать запись, потому что вы не прошли проверку.

В этом тесте ...

19 test "should create user" do 
    20  assert_difference('User.count') do 
    21  post :create, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
    22  end 

Вы ссылка @user, но если у вас есть настройки в этом тесте нет ни одного объекта @user определен.

Попробуйте указать значения ...

19 test "should create user" do 
    20  assert_difference('User.count') do 
    21  post :create, user: { first_name: 'John', last_name: 'Smith', email: '[email protected]' } 
    22  end 
+0

Hi SteveTurczyn, Спасибо за вашу идею. Теперь тест работает нормально без этих сбоев проверки. Но для примечания, когда я указываю значения с фактическими значениями, также работает так же, как и указание этих строк. Приветствия! – masaaki

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