以下是测试:
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
答案 0 :(得分:2)
是的,你的解释是正确的:他说除非User类定义名称和电子邮件属性,否则before块将引发异常,因此在两个提供的示例中测试这些属性的存在是多余的。< / p>
从技术上讲,前面的块验证你可以设置这两个属性,而示例验证你可以获取值,所以有一点点那里有价值,但我同意作者认为测试不值得。
我也同意你的看法,本教程的这一部分可以写得更清楚。