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

什么"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 , but was  12 runs, 15 assertions, 2 failures, 0 errors, 0 skips 

另外, "Expected response to be a , but was "是什么意思?

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

以下是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 

然后在控制台的沙盒中玩了一下之后,我在我的用户模型中添加了电子邮件值,方法是遵循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’/ 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 [通过添加此行添加电子邮件的validation]

 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 [为电子邮件添加字段]

 

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

    

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

 

email:

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

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

无法增加User.count和render <200>也是出于同样的原因……由于validation失败,您无法创建记录。

在这个测试…

  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 

这些失败是由于‘myapp / test / fixtures / users.yml’中缺少email属性引起的,而后来在生产环境中添加了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

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

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

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