ruby-on-rails - 使用 Rspec 测试无效电子邮件

标签 ruby-on-rails rspec

这来自 Learn Rails by example book :

 describe "when email format is invalid" do
    it "should be invalid" do
      addresses = %w[user@foo,com user_at_foo.org example.user@foo.
                     foo@bar_baz.com foo@bar+baz.com]
      addresses.each do |invalid_address|
        @user.email = invalid_address
        @user.should_not be_valid
      end      
    end

我是 的初学者规范 .之前有这样一段代码:
  describe "when email is not present" do
    before { @user.email = " " }
    it { should_not be_valid }
  end

所以我想知道为什么作者没有这样写上面的代码:
 describe "when email format is invalid" do
    before do
      addresses = %w[user@foo,com user_at_foo.org example.user@foo.
                     foo@bar_baz.com foo@bar+baz.com]
      @user.email = invalid_address 
      addresses.each do |invalid_address|
        @user.email = invalid_address
      end 
    end

    it { should_not be_valid }          
 end

好的,也许这段代码是错误的。但基本上,我在问作者为什么不使用 before之前 it或把 address it 之前的变量? (就像他在前面的例子中所做的那样)

编辑:

他还在另一个例子中做了类似的事情:
 describe "when email address is already taken" do
    before do
      user_with_same_email = @user.dup
      user_with_same_email.email = @user.email.upcase
      user_with_same_email.save
    end

    it { should_not be_valid }
  end

最佳答案

答案在于before block 实际上是在做。在这些测试中,它在 it 之前完全运行。正在运行。

因此,第一个代码块运行(并且可以编写)为:

@user.email = 'user@foo,com'
@user.should_not be_valid
@user.email = 'user_at_foo.org'
@user.should_not be_valid
@user.email = 'example.user@foo.'
@user.should_not be_valid
@user.email = 'foo@bar_baz.com'
@user.should_not be_valid
@user.email = 'foo@bar+baz.com'
@user.should_not be_valid

第二个代码块运行(并且可以编写)为:
@user.email = ' '
@user.should_not be_valid

但是第三个 block 在到达 it 之前会遍历整个数组。 ,仅导致:
@user.email = 'foo@bar+baz.com'
@user.should_not be_valid

在最后一个示例中,他正在对同一对象执行一系列操作,这些操作在 it 之前进行评估。 ,只需要运行一次就可以理解。

希望这有帮助,祝你好运!

关于ruby-on-rails - 使用 Rspec 测试无效电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096629/

相关文章:

ruby-on-rails - 为什么我在为 Rails 5 生成 jwt_blacklist 模型时出错?

ruby-on-rails - rails 4 -- 闪光通知

rspec - capybara have_selector 不适用于复选框

rspec - 如何创建仅运行已更改的测试文件的 Guard 配置监视?

ruby-on-rails-3 - 如何使用rspec生成 Controller 规范?

ruby-on-rails - Rails 4 和 Nginx + 乘客的缓存问题

ruby-on-rails - 计算表格中的元素

ruby-on-rails - 是否有任何额外的注入(inject)速记

ruby-on-rails - 测试 rspec 中的字符串数组中是否存在子字符串

ruby-on-rails - 将当前路径与 capybara 和 rspec 进行比较时出错