我有一个带有此验证的用户模型
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)
结束 结束
然后我为每次运行的规格获得一个新名称。
我不想测试它是否使用了一些正则表达式,因为那样我将测试实现而不是行为,而且我也不想只测试一个硬编码案例。
我的问题是:我应该这样做吗?真的需要吗?它是更好还是无用?您知道测试这种验证的更好方法吗?
编辑:另一个问题,如何生成无效的随机名称?有没有办法创建包含至少一个超出允许值的字符的随机名称?我不能硬编码所有无效值的数组来随机化它,因为它太大了
查看开源项目 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)
针对随机数据进行测试是一种称为模糊测试的常见测试技术。我会考虑使用FuzzBert 的生成器来创建真正的随机二进制数据来进行测试。
\n\n以下是一些您不希望通过验证的重要随机数据的示例。
\n\nirb> 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\nRun 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| 归档时间: |
|
| 查看次数: |
5094 次 |
| 最近记录: |