我可以使用FactoryGirl创建无效值吗?

r4noobie

我有电子邮件工厂(spec / factories / email.rb):

FactoryGirl.define do
  factory :email, class: String do
    skip_create

    transient do
      username 'user'
      subdomain 'mail'
      domain_name 'example.com'

      host { [subdomain, domain_name].compact.join('.') }
    end

    trait(:with_blank_host) { host '' }
    trait(:with_blank_username) { username '' }

    initialize_with { new("#{username}@#{host}") }
  end
end

我有规格(spec / models / user_spec.rb):

RSpec.describe User, type: :model do
  # ...

  it { is_expected.to_not allow_value(FactoryGirl.create(:email, :with_blank_host)).for(:email) }
  it { is_expected.to_not allow_value(FactoryGirl.create(:email, :with_blank_username)).for(:email) }
end

以这种方式使用FactoryGirl是否正确?这是不良做法吗?

虚幻的

假设创建没有主机名/用户名的电子邮件的逻辑将只在测试中使用。为什么要保留在工厂?

为什么不简单地做:

FactoryGirl.define do
  factory :email, class: String do
    skip_create

    transient do
      username 'user'
      subdomain 'mail'
      domain_name 'example.com'

      host { [subdomain, domain_name].compact.join('.') }
    end
    initialize_with { new("#{username}@#{host}") }
  end
end

RSpec.describe User, type: :model do
  # ...

  it 'should not allow blank host' do
    is_expected.to_not allow_value(FactoryGirl.create(:email, host: '')).for(:email)
  end

  it 'should not allow blank username' do
    is_expected.to_not allow_value(FactoryGirl.create(:email, username: '').for(:email)
  end
end

除此之外,让工厂创建电子邮件字符串真的有意义吗?为什么不简单地使用字符串(这更简单):

is_expected.to_not allow_value(FactoryGirl.create(:email, host: '')).for(:email)

is_expected.to_not allow_value('test@').for(:email)

如果您希望通过测试获得一致的:email,为什么不将其放入用户。

FactoryGirl.define do
  factory :user

    transient do
      username 'user'
      subdomain 'mail'
      domain_name 'example.com'

      host { [subdomain, domain_name].compact.join('.') }
    end

    before(:create) do |user, evaluator|
      user.email = "#{username}@#{host}"
    end
  end
end

但是,如果逻辑属于那些特定的测试,为什么要在工厂中对所有这些进行抽象而不是简单地使用前/回调。根据经验,我只会在工厂中的所有规范文件中使用逻辑,其他所有内容都在回调之前/之后正确

RSpec.describe User, type: :model do
  before :each do
    # logic before each test of the file
  end

  context 'email validation'

    before :each do
      # logic before each test concerning the email validation
      # useful to factor stuff that will be used multiple time
      # e.g.
      #  @email_ok = '[email protected]'
    end

    it 'should not allow blank host' do
      # test specific setup
      # useful for stuff only used in this test
      # e.g
      #  email_no_host = 'user@'

      # expectation
    end
  end
end

简而言之:

当然,您在做什么。这本身不是一个坏习惯。恕我直言,这没有多大意义。

已编辑

您也可以在测试范围内添加一个帮助程序,以免模型太胖:

RSpec.describe User, type: :model do
  context 'email validation'
    def generate_email(**opts)
        options = {username: 'user', subdomain: 'mail', domain_name 'example.com'}.merge(opts)
        username = options[:username]
        host = options[:host] || "#{options[:subdomain]}.#{options[:domain_name]}"

        "#{username}@#{host}"
    end

    it 'should not allow blank host' do
      is_expected.to_not allow_value(generate_email host: '').for(:email)
    end

    # Here goes 100 other use of generate_email
  end
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以使用LinqPad创建的DbContext吗?

来自分类Dev

我可以使用MySQL Workbench创建MariaDB吗?

来自分类Dev

我可以使用lxml创建此XML文件吗?

来自分类Dev

我可以使用内联操作按钮创建DataTable吗?

来自分类Dev

我可以使用简单的Int创建结构的实例吗?

来自分类Dev

我可以使用标准JavaScript函数创建XMLHttpRequest吗?

来自分类Dev

我可以使用Openssl创建DKIM密钥吗

来自分类Dev

我可以使用Terraform创建GCP API密钥吗?

来自分类Dev

我可以使用flutter在Firestore上创建索引吗?

来自分类Dev

我可以使用SVG创建书法外观吗?

来自分类Dev

我可以使用MySQL Workbench创建数据吗?

来自分类Dev

我可以使用PhoneGap创建和提交iBook吗

来自分类Dev

我可以使用“相对”变量创建HashMap吗?

来自分类Dev

我可以使用Object.assign创建“类”吗

来自分类Dev

我可以使用ReactTransitionGroup在更新时创建过渡吗?

来自分类Dev

我可以使用 Flexbox 创建背景和前景吗?

来自分类Dev

我可以使用 '?P=pagename' 创建 PHP 页面吗?

来自分类Dev

我可以使用其他值扩展枚举吗?

来自分类Dev

我可以使用默认/最大值分区创建一个不断增长的间隔分区表吗?

来自分类Dev

返回XML的API。我可以使用XmlTextWriter吗,这会比创建XmlDocument快吗?

来自分类Dev

我可以使用 mutate() 来模拟我将从使用 dplyr 的汇总() 加入的值吗?

来自分类Dev

我可以使用python CSP吗?

来自分类Dev

我可以使用迭代器吗?

来自分类Dev

我可以使用通配符替换吗

来自分类Dev

我可以使用RTF格式吗?

来自分类Dev

骨骼可以使用我的插件吗?

来自分类Dev

我可以使用 wxpython 使用迭代创建大量按钮吗?

来自分类Dev

可以使用prolog来确定无效的推论吗?

来自分类Dev

我可以使用Typescript以更紧凑的方式创建服务吗?

Related 相关文章

  1. 1

    我可以使用LinqPad创建的DbContext吗?

  2. 2

    我可以使用MySQL Workbench创建MariaDB吗?

  3. 3

    我可以使用lxml创建此XML文件吗?

  4. 4

    我可以使用内联操作按钮创建DataTable吗?

  5. 5

    我可以使用简单的Int创建结构的实例吗?

  6. 6

    我可以使用标准JavaScript函数创建XMLHttpRequest吗?

  7. 7

    我可以使用Openssl创建DKIM密钥吗

  8. 8

    我可以使用Terraform创建GCP API密钥吗?

  9. 9

    我可以使用flutter在Firestore上创建索引吗?

  10. 10

    我可以使用SVG创建书法外观吗?

  11. 11

    我可以使用MySQL Workbench创建数据吗?

  12. 12

    我可以使用PhoneGap创建和提交iBook吗

  13. 13

    我可以使用“相对”变量创建HashMap吗?

  14. 14

    我可以使用Object.assign创建“类”吗

  15. 15

    我可以使用ReactTransitionGroup在更新时创建过渡吗?

  16. 16

    我可以使用 Flexbox 创建背景和前景吗?

  17. 17

    我可以使用 '?P=pagename' 创建 PHP 页面吗?

  18. 18

    我可以使用其他值扩展枚举吗?

  19. 19

    我可以使用默认/最大值分区创建一个不断增长的间隔分区表吗?

  20. 20

    返回XML的API。我可以使用XmlTextWriter吗,这会比创建XmlDocument快吗?

  21. 21

    我可以使用 mutate() 来模拟我将从使用 dplyr 的汇总() 加入的值吗?

  22. 22

    我可以使用python CSP吗?

  23. 23

    我可以使用迭代器吗?

  24. 24

    我可以使用通配符替换吗

  25. 25

    我可以使用RTF格式吗?

  26. 26

    骨骼可以使用我的插件吗?

  27. 27

    我可以使用 wxpython 使用迭代创建大量按钮吗?

  28. 28

    可以使用prolog来确定无效的推论吗?

  29. 29

    我可以使用Typescript以更紧凑的方式创建服务吗?

热门标签

归档