在HyperSpec中检查项目是否“可点击”

问题描述 投票:5回答:4

我有一个像这样的Hyperstack组件:

      render do
        LI(class: class_names, title: conflicts || '',
           data: { toggle: :tooltip, placement: 'auto left', container: :body }) do
          DIV(class: 'row paper-row') do
            DIV(class: 'col-sm-12 text-left') do
              P(class: 'medium-weight', id: 'tp_envelopes') { params.envelope.name }
            end
          end
        end.on(:click) { select_envelope }
      end

如果conflicts方法返回非零值,我希望on(:click)处理程序是有条件的。

我也想知道如何在hyperspec / capaybara中测试这个...即如何检查html元素是否响应:click事件?

ruby-on-rails ruby reactjs hyperstack
4个回答
3
投票

您可以使用有条件地关闭/打开单击处理程序

end.tap { |item| item.on(:click) { select_envelope } unless conflicts }

取代

end.on(:click) { select_envelope }

2
投票
end.on(:click) { select_envelope }

你可以用以下代码替换(:click)

(!conflicts && :click)

这是有效的,因为如果冲突不是nil,这将导致零点击处理程序不执行任何操作。


1
投票

由于事件冒泡,我不确定检查单击事件的元素是否可靠。

我会编写测试来单击元素,然后期望click事件中的任何逻辑都不会发生。

conflicts = true

element.click() # trigger select_envelope

expect(selected_envelope).to be_nil # no envelope should be selected due to conflicts

1
投票

保持代码清洁的一个好方法就是返回事件中调用的方法:

def select_envelope
  return if conflicts

  ...
end

# this keeps the event handler the same
end.on(:click) { select_envelope }

由于不得不总是触发事件,因此性能可以忽略不计,但总会出现性能与可读性的争论。

© www.soinside.com 2019 - 2024. All rights reserved.