"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
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
的文件,我认为这在开始时并不相关。但实际上这是由于这些失败造成的。所以我在答案中引用此文件中的代码。为简单起见,我不在我的问题部分中引用它。
答案 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)
redirect_to @user
中有users_controller#update
吗?