在Rspec中传递科目

时间:2012-12-02 15:32:37

标签: parameters rspec

我正在尽力绕过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。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

您正在寻找的可能是共享示例组,这是rSpec中用于干预测试的功能。

https://www.relishapp.com/rspec/rspec-core/v/2-0/docs/example-groups/shared-example-group#shared-example-group-applied-to-two-groups

当您拥有具有共同功能的父类或使用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