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

时间:2019-04-11 13:51:28

标签: ruby-on-rails ruby reactjs hyperstack

我有一个像这样的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方法返回非nil值,我希望on(:click)处理函数为条件。

我还想知道如何在hyperspec / capaybara中对此进行测试...即如何检查html元素是否响应:click事件?

4 个答案:

答案 0 :(得分:3)

您可以通过使用

有条件地关闭/打开点击处理程序

class CSV
{
    private $handle;
    private $file;

    function __construct($mode,$file) {
        $this->file=$file;
        try {
            $this->handle = fopen($file, "$mode");
        } catch (PDOException $e) {
            exit('Error');
        }
    }

    public function getAll()
    {
        $csv = array();
        //metto tutto il file in un'array
        $lines = file($this->file);

        foreach ($lines as $key => $value)
        {
            $csv[$key] = str_getcsv($value,";");
        }
        fclose($this->handle);
        return $csv;
    }
}

替换

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

答案 1 :(得分:2)

end.on(:click) { select_envelope }

您可以替换(:click) 与:

(!conflicts && :click)

之所以起作用,是因为如果冲突不是零,则将导致零点击处理程序不执行任何操作。

答案 2 :(得分:1)

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

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

conflicts = true

element.click() # trigger select_envelope

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

答案 3 :(得分:1)

保持代码干净的一种好方法是在事件中调用的方法内部返回:

def select_envelope
  return if conflicts

  ...
end

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

必须始终触发事件对性能的影响可以忽略不计,但始终存在性能与可读性之间的争论。