0

我目前正在开发一个 RoR 4 应用程序。

在我的应用程序中,我正在尝试实现类似于 Mickael Hartl 教程的用户测试。我想了解有关电子邮件唯一性测试的一些事情:

1 - 在实际写入数据库时​​测试唯一性,对吗?

以与教程中相同的方式编写测试时,效率不高。@user = User.new(...) 实际上只在内存中实例化用户。以下测试:

describe "when email address is already used" do
  before do
    user_with_same_email = @user.dup
    user_with_same_email.save
  end

  it { should_not be_valid }
end

就我而言,仅当 @user = user.new(...) 指令后跟 user.save 指令时才有效。我对吗 ?

附加说明:在用户模型中实现电子邮件唯一性时,它总是失败!?!你能告诉我这个测试有什么问题吗?

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, uniqueness: true, length: { maximum: 100 }, format: { with: VALID_EMAIL_REGEX }

2 - RSPEC 真的写入 TEST 数据库吗?

运行上述测试(user.new(...) - user.save - user.dup - user.save)后,我检查了 TEST SQLite3 数据库文件的“修改日期”。运行测试时未触及。spec_hepler.rb 文件以:

ENV["RAILS_ENV"] ||= 'test'

我错过了什么 ?

谢谢您的帮助,

此致,

弗雷德

4

1 回答 1

1

关于您的第一点,唯一性验证确实发生在您调用save. 但是,您也可以通过调用来调用所有验证valid?- 这就是这样be_valid做的。所以它实际上不需要保存@user模型来进行这个测试。

关于您的第二点,RSpec 绝对会写入数据库。但是,它在事务范围内运行每个测试(默认情况下)。在每个测试结束时,它不会提交事务,而是将其回滚。这使数据库处于测试开始之前的相同状态,有效地允许每个测试与其他测试隔离,同时就像您的代码在生产中(几乎)一样使用数据库。关于您关于文件修改时间的观点,SQLite 不一定会在您进行调用时将数据写入文件,直到它们实际提交。

于 2013-09-03T02:44:49.823 回答