使用 assert_match 验证多个字符串是否符合要求的顺序

verifying that multiple strings are in required order with assert_match

如何使用 assert_match

验证字符串的顺序
assert_match /string_1.*string_2.*string_3/, page.html

即使 string_1string_2string_3 在页面中以相同的顺序出现也是如此。

我刚刚尝试了以下...

查看:

string_1string_2string_3

测试:

assert_match /string_1.*string_2.*string_3/, page.html

这就过去了。

我不确定您遇到了什么问题。当然,除非 string_1 等是变量名,而不是您要搜索的字面意思。那么测试代码应该使用插值:

# Example variables with string values
string_1 = "alpha"
string_2 = "beta"
string_3 = "charlie"

# Using the variables in the regex via interpolation
assert_match /#{string_1}.*#{string_2}.*#{string_3}/, page.html

问题可能是"string_1"、"string_2"和"string_3"在不同的线路上。

在正则表达式中,点 (.) 匹配除换行符之外的任何单个字符。如果三个字符串在同一行(即中间没有换行符),您将看到匹配有效:

html = '<div>string_1</div><div>string_2</div><div>string_3</div>'
p html.match(/string_1.*string_2.*string_3/)
#=> #<MatchData "string_1</div><div>string_2</div><div>string_3">

但是,如果字符串被分成多行(即中间有换行符),则不会匹配:

html = '<div>string_1</div>
    <div>string_2</div>
    <div>string_3</div>'
p html.match(/string_1.*string_2.*string_3/)
#=> nil

为了点也匹配换行符,通过在末尾添加 m 启用多行选项:

html = '<div>string_1</div>
    <div>string_2</div>
    <div>string_3</div>'
p html.match(/string_1.*string_2.*string_3/m)
#=> #<MatchData "string_1</div>\n\t<div>string_2</div>\n\t<div>string_3">

换句话说,断言可能需要使用多行选项:

assert_match /string_1.*string_2.*string_3/m, page.html