【问题标题】:Specifying minimum length when using FFaker::Internet.user_name使用 Ffaker::Internet.user_name 时指定最小长度
【发布时间】:2018-06-27 20:43:14
【问题描述】:

我的规范一直失败,因为 Ffaker::Internet.user_name 生成的单词少于 5 个字符。

如何在这个 stmt 中指定最小长度:

username { FFaker::Internet.user_name }

【问题讨论】:

    标签: ruby-on-rails ruby rspec rspec-rails


    【解决方案1】:

    据我所知,您尝试在工厂中使用 Ffaker。当您可以定义 sequence

    时,为什么要让您的规格过于复杂
    sequence(:username) do |n|
       "username-#{n}"
    end
    

    但是这个问题是有效的,你可能有一些使用 ffaker 的合法需求,并且有很多方法可以做到这一点。您可以将用户名连接两次,为什么不呢?

    username { FFaker.username + FFaker.username }
    

    或者继续寻找长度最短的用户名:

    username do
       do
         name = FFaker.username
       while name.length < 5
       name
    end
    

    或者monkeypatch ffaker自己实现https://github.com/ffaker/ffaker/blob/0578f7fd31c9b485e9c6fa15f25b3eca724790fe/lib/ffaker/internet.rb#L43 + https://github.com/ffaker/ffaker/blob/0578f7fd31c9b485e9c6fa15f25b3eca724790fe/lib/ffaker/name.rb#L75

    例如

    class FFaker
      def long_username(min_length = 5)
        fetch_sample(FIRST_NAMES.select {|name| name.length >= min_lenght })
      end
    end
    

    【讨论】:

      【解决方案2】:

      有很多方法可以实现这一点,但如果我必须这样做,我会做类似的事情

      (FFaker::Internet.user_name + '___')[0...5]
      #=> "Lily_"
      

      有三个下划线,因为在快速查找name list 后,我发现名字的最小长度是两个字符,所以二加三总是至少五个字符。

      我只使用五个字符的子字符串,以便不总是有尾随下划线,但这只是我个人的喜好,你可以使用用户名加上三个下划线,你的测试用例就可以了。

      【讨论】:

        【解决方案3】:

        String#ljust — 返回给定长度的 self 的副本,右填充给定的其他字符串。

        username { FFaker::Internet.user_name.ljust(5,"12345") }
        

        【讨论】:

          【解决方案4】:

          你不能,但你可以做 FFaker::Name.name.join,这会生成名字和中间名

          【讨论】:

          • 谢谢,我会试试的。是否有可能即使这种方法最终也会生成少于 5 个字符的单词?
          • 不幸的是 - 你不能确定 ffaker 样本数据中有什么
          【解决方案5】:

          您也可以使用 FFaker::String 使用正则表达式手动构建它,如下所示:

          # 5 characters username, with first character being a letter
          username { FFaker::String.from_regexp(/[a-zA-Z]\w{4}/) }
          
          # random 5-10 characters username with first character being a letter
          regex = Regexp.new("[a-zA-Z]\\w{#{Random.rand(4..9)}}")
          username { FFaker::String.from_regexp(regex) }
          

          【讨论】:

            【解决方案6】:

            另一个想法是在末尾添加一些随机数。这对我有用,易于实现,而且看起来相当自然(因为人类在野外创建用户名时往往会这样做)。

            例如这会将“1234”添加到用户名的末尾:

            "steve" + "1234"
            

            Faker:

            Faker::Internet.unique.user_name + "1234"
            

            注意:如果您想要一个随机字符串(而不是“1234”,请尝试一些these 方法。但是,如果您已经在使用上面示例中的Faker .unique 方法,则可能没有必要.

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-11
              • 2018-12-11
              • 1970-01-01
              • 1970-01-01
              • 2019-07-16
              相关资源
              最近更新 更多