ROR Tut:文本声称在之前的块中创建没有名称的用户将抛出异常

时间:2014-09-20 03:13:02

标签: ruby rspec

以下是测试:

require 'spec_helper'

describe User do

  before { @user = User.new(name: "Example User", email: "user@example.com") }
  subject { @user }

  it { should respond_to(:name) }
  it { should respond_to(:email) }

end

这是6.2.1节中的Listing 6.5

https://www.railstutorial.org/book/modeling_users#code-user_spec

文本声称:

  

作为用户,这些测试本身并不是特别有用   没有(比方说)name属性的对象将抛出一个   前一块中的异常。

在本教程的前一部分中,作者带领读者完成了rails控制台中创建用户,保存和搜索用户的一些演示。在rails控制台中,可以创建没有name属性的用户实例。当我尝试将之前的块更改为:

 before { @user = User.new(email: "user@example.com") }

正如我所料,只要眼睛看到,测试就是绿色。有人知道作者在说什么吗?

用户迁移如下:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

这里我们再说一遍......作者似乎在说,如果你最初创建了一个不同的用户模型 - 一个只有一个电子邮件地址 - 那么当你试图给一个时,前一个块会抛出异常这些用户的值是(不存在的):name属性。因此,如果before块没有抛出异常,那么您已经知道before block中指定的属性存在,因此respond_to测试是多余的。是时候尝试回滚命令,看看是否真的......

好的,before块会抛出异常,导致两个respond_to测试失败。

如果有人想知道我做了什么来测试作者的断言:

1)bundle exec rake db:rollback
从数据库中删除表,反转迁移文件的作用,但不删除迁移文件。

2)然后我将迁移文件db/migrate/20140919040051_create_users.rb更改为:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      #t.string :name   <---Note the comment at the start of the line.
      t.string :email

      t.timestamps
    end
  end
end

3)bundle exec rake db:migrate
在db中创建一个新表,但这次没有名称字段/列。

4)bundle exec rake test:prepare
5)bundle exec rspec spec/models/user_spec.rb

1 个答案:

答案 0 :(得分:2)

是的,你的解释是正确的:他说除非User类定义名称和电子邮件属性,否则before块将引发异常,因此在两个提供的示例中测试这些属性的存在是多余的。< / p>

从技术上讲,前面的块验证你可以设置这两个属性,而示例验证你可以获取值,所以有一点点那里有价值,但我同意作者认为测试不值得。

我也同意你的看法,本教程的这一部分可以写得更清楚。