首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在test.check中生成随机电子邮件地址?

如何在test.check中生成随机电子邮件地址?
EN

Stack Overflow用户
提问于 2021-08-16 21:07:28
回答 3查看 118关注 0票数 1

我尝试使用gen/fmap和两个随机的字母数字字符串。然后,我将它们与"@“连接起来,并附加".com”。但我在语法上苦苦挣扎。

第一次尝试:

代码语言:javascript
复制
(gen/fmap str (gen/string-alphanumeric) "@" (gen/string-alphanumeric) ".com")

但是gen/fmap只有两个参数。

第二次尝试,我将第二部分分组也不起作用

代码语言:javascript
复制
(gen/fmap str ((gen/string-alphanumeric) "@" (gen/string-alphanumeric) ".com"))

编辑:我有一个部分解决方案。它生成一个电子邮件地址,但@前后的部分是相同的。示例: john@john.com

这是部分解决方案

代码语言:javascript
复制
(def gen-full-string
  (gen/such-that #(not= % "") gen/string-alphanumeric))

(gen/fmap #(str % "@" % ".com") gen-full-string) 

我写gen-full-string是因为空字符串""会使代码崩溃。因为我要进行解析,并计划创建验证函数,所以我并不关心空字符串。我想测试的是核心功能,而不是边缘用例。一旦我实现了验证,我可能会删除gen-full-string。因此,电子邮件生成器将变成(gen/fmap #(str % "@" % ".com") gen/string-alphanumeric)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-16 22:55:14

当我运行这个脚本时:

代码语言:javascript
复制
clojure -Sdeps '{:deps {org.clojure/test.check {:mvn/version "1.1.0"}}}' /dev/stdin <<EOF

  (require '[clojure.test.check.generators :as gen])

  (def gen-email
    (gen/fmap (fn [[s1 s2]] (format "%s@%s.com" s1 s2))
              (gen/tuple gen/string-alphanumeric
                         gen/string-alphanumeric)))

  (run! prn (gen/sample gen-email))
EOF

我得到以下输出:

代码语言:javascript
复制
"@.com"
"@.com"
"9p@VH.com"
"x1@Ws.com"
"23mF@93.com"
"b40@14.com"
"v0n@5Wskg.com"
"mNo@R85LuM.com"
"@.com"
"8Z84B9U0@f9QSJgM.com"
票数 3
EN

Stack Overflow用户

发布于 2021-08-16 22:51:34

Gary Fredericks有一个库https://github.com/gfredericks/test.chuck,它将字符串正则表达式生成添加到规范中。这允许您使用一个简单或详细的正则表达式,就像您想要的电子邮件地址一样。

票数 4
EN

Stack Overflow用户

发布于 2021-08-16 22:46:53

我喜欢test.check,但它需要很多时间来理解细节。我创建了你可能会喜欢的a helper library。举个例子:

代码语言:javascript
复制
(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [tupelo.gen :as tg]
    [clojure.test.check.properties     :as prop]
  ))

(dospec 9
  (do
    (newline)
    (spy :sample)
    (prop/for-all [w tg/word-alpha+]
      (spyx w))))

(dospec 9
  (do
    (newline)
    (spy :emails)
    (prop/for-all [w1 tg/word-alpha+
                   w2 tg/word-alpha+]
      (let [email-addr (str w1 \@ w2 ".com")]
        (spyx email-addr)
        )
      )))

with result:

代码语言:javascript
复制
-----------------------------------
   Clojure 1.10.3    Java 15.0.2
-----------------------------------

Testing tst.demo.core

:spy--tst.demo.core--line-011 => :sample
w => "b"
w => "lb"
w => "k"
w => "Y"
w => "mMWC"
w => "TzD"
w => "Nq"
w => "wQzPrF"
w => "HqEM"
{:result true, :num-tests 9, :seed 1629153846012, :time-elapsed-ms 1, :test-var "dospec-line-8"}

:spy--tst.demo.core--line-018 => :emails
email-addr => "k@v.com"
email-addr => "M@uL.com"
email-addr => "N@a.com"
email-addr => "OUr@B.com"
email-addr => "O@v.com"
email-addr => "UtZ@ndXS.com"
email-addr => "qhtDt@YLfE.com"
email-addr => "mLw@pFjKJJq.com"
email-addr => "hJ@DkCSnpAG.com"
{:result true, :num-tests 9, :seed 1629153846014, :time-elapsed-ms 1, :test-var "dospec-line-15"}

更多details here。上面的例子使用了my favorite template project

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68809214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档