这来自 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/