Parameters 通过Rspec考试的科目

Parameters 通过Rspec考试的科目,parameters,rspec,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@fo

我正在尽我最大的努力去理解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”始终为零。感谢您的帮助。

您正在寻找的可能是共享示例组,这是rSpec中的一项功能,可以使测试干涸


当您有一个具有公共功能的父类,或者正在使用mixin在两个(或更多)类之间共享内容时,通常会使用它。

看起来您正在引用。我在那里使用了和实用程序方法,与您的想法类似,使我的电子邮件相关的验证测试干涸

我不认为最好(/可能?)将整个
描述
块放在实用方法中;只需在多个方法中引用代码片段,或包含电子邮件地址的数组等长代码位。无论如何,供你参考,以下是我的结论:

Gemfile

# ...
gem 'shoulda-matchers', '1.4.2'
规格/型号/用户规格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
# ...
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
spec/support/utilities.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
# ...
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

您确定测试中正在实例化@user吗?无论如何,关于共享示例的建议是好的。