Rails 4.2中如何用assert_select断言类的存在与不存在?
解决Rails 4.2中assert_select的几个常见问题
嘿,我来帮你搞定这些在Rails 4.2测试里遇到的assert_select问题!下面逐个拆解你的困扰:
1. 检查元素/类不存在时的ArgumentError报错
你尝试用assert_select 'p.class_name', false或者assert_select '.class_name', false报错,是因为Rails 4.2的assert_select不支持直接传false作为第二个参数。这个方法的参数规则里,第二个参数如果是数字代表匹配数量,是字符串代表匹配文本,传false会触发参数数量不匹配的错误。
正确的写法有两种:
- 用
:count选项指定数量为0:# 检查没有带class_name类的p标签 assert_select 'p.class_name', count: 0 # 检查页面上没有任何带class_name类的元素 assert_select '.class_name', count: 0 - 用块结合条件判断:
如果需要更灵活的检查(比如判断某个p标签是否不含某个类),可以用块:assert_select 'p' do |p_elements| # 断言所有p标签都没有class_name类 assert p_elements.none? { |p| p.has_class?('class_name') } end
2. 属性选择器选中所有p标签的问题
你用assert_select 'p', :attributes => {:class => 'class-name'}选中了所有p标签,是因为这个语法不对——Rails 4.2里不需要用:attributes这个键,直接把属性作为选项传入即可:
正确写法:
# 匹配带class-name类的p标签 assert_select 'p', class: 'class-name' # 或者直接用CSS选择器写法(更直观) assert_select 'p.class-name'
3. 检查文本存在的问题
如果要检查元素包含特定文本,有几种常用方式:
- 精确匹配文本:
# 检查带class-name类的p标签文本完全等于"Hello World" assert_select 'p.class-name', 'Hello World' - 模糊匹配(包含文本):
用正则表达式或者块判断:# 用正则匹配包含"Hello"的文本 assert_select 'p.class-name', /Hello/ # 用块判断文本包含指定内容 assert_select 'p.class-name' do |elements| assert elements.first.text.include?('Hello') end
内容的提问来源于stack exchange,提问作者Souravirus
相关产品推荐
相关产品推荐

