我正在尽力绕过Rspec的流程,但最简单的事情似乎让我感到厌烦。
我想在两个不同的模型上重用一些属性格式有效性的测试。所以,我认为我会将这些Rspec测试移动到另一个方法,只需调用正在测试的主题的方法。即从:
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
end
对于这样的事情:
describe "email format checking" do
valid_email_check(@user)
end
..和utilities.rb
def valid_email_check(subject)
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|
subject.email = invalid_address
subject.should_not be_valid
end
end
end
end
传递给此函数时,“subect”始终为nil。任何帮助表示赞赏。
答案 0 :(得分:0)
您正在寻找的可能是共享示例组,这是rSpec中用于干预测试的功能。
当您拥有具有共同功能的父类或使用mixin在2个(或更多)类之间共享内容时,通常会使用它。
答案 1 :(得分:0)
看起来您正在引用Listing 6.16 in the Rails Tutorial。我使用shoulda-matchers
gem和实用程序方法在那里干掉了与我的电子邮件相关的验证测试,类似于您的想法。
我不认为在实用程序方法中放置整个describe
块是最好的(/可能?);只是你可能在多种方法中引用的代码片段,或者像包含电子邮件地址的数组那样的长代码。无论如何,供你参考,这是我最终的结果:
<强>的Gemfile 强>
# ...
gem 'shoulda-matchers', '1.4.2'
<强>规格/模型/ user_spec.rb 强>
describe User do
let(:user) { FactoryGirl.create(:user) }
subject { user }
# ...
describe "validations" do
# ...
context "for email" do
it { should validate_presence_of(:email) }
it { should_not allow_value(" ").for(:email) }
it { should validate_uniqueness_of(:email).case_insensitive }
context "when email format is invalid" do
invalid_email_addresses.each do |invalid_address|
it { should_not allow_value(invalid_address).for(:email) }
end
end
context "when email format is valid" do
valid_email_addresses.each do |valid_address|
it { should allow_value(valid_address).for(:email) }
end
end
end
end
end
<强>规格/支持/ utilities.rb 强>
# ...
def invalid_email_addresses
%w[user@foo,com user_at_foo.org example.user@foo.
foo@bar_baz.com foo@bar+baz.com]
end
def valid_email_addresses
%w[user@foo.com A_USER@f.b.org frst.lst@foo.jp a+b@baz.cn]
end