“User.count”没有改变1 - Rails

时间:2015-06-22 22:01:36

标签: ruby-on-rails ruby

"User.count" didn't change by 1的含义以及如何解决?以下是来自控制台的命令行。

以下是我从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>"是什么意思?

以下代码是我在此测试中运行的代码:

以下是users_controller_test.rb

中的第39行
  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),下面是 users_controller_test.rb

中的第20行
  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

先决条件:

我添加了有价值的电子邮件后来我通过遵循Jonathan MacDonald的YouTube教程“如何在Windows 7上安装Ruby on Rails - 第4部分,Ruby on Rails”创建了我的初始用户模型 流程从11:00开始

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

然后在控制台的沙盒中玩了一下之后,我通过跟踪来自railstutorial org电子书的 6.3.1散列密码中的过程,在我的用户模型中添加了电子邮件值:

原始命令:

$ 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'/ app / controllers / users_controller.rb  [add:email in permit()]

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

2)'myapp / test / controllers / users_controller_test.rb'  [在'test'中添加电子邮件:@ user.email应该创建用户“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'/ app / models / user.rb  [通过添加此行添加电子邮件的验证]

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

2)'myapp'/ test / modles / user_test.rb  [在用户设置的定义中添加电子邮件值]

def setup
    @user = User.new(first_name: "Example", last_name:"User", email: "aaaa@bbbbbbb.com")
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)'myapp'/ app / views / users / _form.html.erb  [为电子邮件添加字段]

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

2)'myapp'/ app / views / users / index.html.erb  [在表格中添加电子邮件]

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

3)'myapp'/ app / views / users / show.html.erb  [在段落中添加电子邮件部分]

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

然后当我运行bundle exec rake test时,我一直面临着我提出的这些错误。

有一个名为users.yml的文件,我认为这在开始时并不相关。但实际上这是由于这些失败造成的。所以我在答案中引用此文件中的代码。为简单起见,我不在我的问题部分中引用它。

4 个答案:

答案 0 :(得分:8)

未能增加User.count和渲染&lt; 200&gt;出于同样的原因......由于验证失败,您无法创建记录。

在这个测试中...

  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: 'johnsmith@example.com' }
  22     end

答案 1 :(得分:7)

这些失败是由'myapp / test / fixtures / users.yml'中缺少的电子邮件属性引起的,而稍后在生产环境中添加了email属性。我创建了初始用户模型'first_name''last_name'没有'email',正如我在问题中的步骤所述。

有许多命令可帮助在初始创建后为新添加的属性添加相关文件中的属性。但我手动在相关文件中添加了属性,如下面的代码所示。

'MyApp的/测试/装置/ users.yml里'

<强>原始

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

<强>更新

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.在乞讨时'myapp / test / fixtures / users.yml'中只有2个属性'first_name''last_name'它假设有3个属性'first_name''last_name''email'然后我猜这个消息提到'myapp / test / fixtures / users中缺少属性的数量.yml'通过提取号码'1' ..

[回答'200']
我认为这个数字也具有相关源代码而不是HTTP状态代码的独特含义。它实际上只是HTTP状态代码。代码'200'表示正常,您可以在下面的链接中看到。

  

10.2.1 200 OK

     

请求已成功。随响应返回的信息   取决于请求中使用的方法...

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

它表示预期的响应是重定向而不是彻底。

答案 2 :(得分:2)

这可能意味着控制器返回错误。您可以通过转储assigns(:user).errors的内容来查看错误。 Pry或其他REPL会有所帮助。否则,puts assigns(:user).errors.inspect应该有效。

答案 3 :(得分:-1)

  1. 用户应该已经创建,但事实并非如此。很多可能的原因,即重复电子邮件。
  2. 您的测试需要在编辑用户后进行重定向,但rails只会渲染一些页面。您在redirect_to @user中有users_controller#update吗?