1

我正在尽我所能了解 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

..和实用程序.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”始终为零。任何帮助表示赞赏。

4

2 回答 2

0

看起来您正在引用Rails 教程中的清单 6.16。我在那里使用shoulda-matchersgem和实用程序方法完成了与电子邮件相关的验证测试,类似于您的想法。

我认为将整个describe块放在实用程序方法中不是最好的(/可能?);只是您可能在多种方法中引用的代码片段,或者像包含电子邮件地址的数组这样的长代码。无论如何,供您参考,这就是我最终得到的结果:

宝石文件

# ...
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

规范/支持/实用程序.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
于 2012-12-09T08:42:05.383 回答
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 个(或更多)类之间共享内容时,通常会使用它。

于 2012-12-03T11:46:46.413 回答