测试“验证...,格式=> 与”

ari*_*uod 5 rspec rspec-rails

我有一个带有此验证的用户模型

validates :name, :lastname, :format => {:with => /^[a-zA-Z]+$/, :message => 'Only letters and spaces allowed.'}
Run Code Online (Sandbox Code Playgroud)

我不确定如何正确测试它。

我已经完成了一个函数,该函数返回由 a-zA-z 字符数组中的 10 个字符组成的随机字符串。

def get_random_name
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split('').shuffle[0..10].join
Run Code Online (Sandbox Code Playgroud)

结束 结束

然后我为每次运行的规格获得一个新名称。

我不想测试它是否使用了一些正则表达式,因为那样我将测试实现而不是行为,而且我也不想只测试一个硬编码案例。

我的问题是:我应该这样做吗?真的需要吗?它是更好还是无用?您知道测试这种验证的更好方法吗?

编辑:另一个问题,如何生成无效的随机名称?有没有办法创建包含至少一个超出允许值的字符的随机名称?我不能硬编码所有无效值的数组来随机化它,因为它太大了

har*_*low 5

查看开源项目 Shoulda Matchers:https : //github.com/thoughtbot/should-matchers

编辑:抱歉刚刚注意到也Paul Fioravanti提到了应该。但是,您不需要使用 FactoryGirl 来创建模型的实例。create验证测试不需要使用。

您可以直接在模型上创建单元测试:


describe User, 'Validations' do
  it { should allow_value("Name").for(:name) }
  it { should_not allow_value("Inv4lid_").for(:name) }
end
Run Code Online (Sandbox Code Playgroud)


lig*_*h05 1

针对随机数据进行测试是一种称为模糊测试的常见测试技术。我会考虑使用FuzzBert 的生成器来创建真正的随机二进制数据来进行测试。

\n\n

以下是一些您不希望通过验证的重要随机数据的示例。

\n\n
irb> require \'fuzzbert\'\n       => true\nirb> test_string = FuzzBert::Generators.random_fixlen(10)[]\n       => "S\\x1EU1\\x11HVY\\x0E\\xD0"\nirb> puts test_string\n     S\xe2\x96\xb2U1\xe2\x97\x84HVY\xe2\x99\xab\xef\xbf\xbd\n       => nil\n
Run Code Online (Sandbox Code Playgroud)\n\n

随机是好的

\n\n

因为它将随机二进制位转换为字符串,所以您将得到一些非常奇怪的结果来进行测试。这是一件好事!它不仅会测试使用已知符号(如?),还会测试有效和无效字符的各种组合。

\n\n

随机有时是有效的

\n\n

您有可能时不时地获得有效数据,尽管可能性很小。此外,您创建的随机字符串越长,获得有效数据的几率就越小。

\n\n

解决此问题的第一次尝试可能是在每个输出中附加一个无效字符,但我不建议这样做。例如,如果您总是附加“!”,那么它将使您的测试相当于确保字符串没有“!” 其中而不是对完整正则表达式可能性的真正测试。

\n\n

我建议根据相同的正则表达式测试您的随机字符串(如果确实如此)通过了,则生成一个不同的字符串进行测试。

\n\n

最后,您可以忽略随机数据有效的罕见机会。如果这个特定的 rspec 偶尔失败,请查看它在哪个字符串上失败,如果它是有效字符串,则重新运行。

\n\n

测试所有的可能性

\n\n

您永远无法测试所有无效字符串(除非最大长度很短),但通过使用模糊测试,您将能够测试包含多种有效和无效字符的字符串。

\n