从水豚/恶作剧特征测试中触发角度指示

时间:2014-05-30 15:58:33

标签: javascript ruby angularjs ruby-on-rails-4 capybara

Capybara + Poltergeist在rails 4 + angular app中的大多数功能测试都能正常工作。但是,我在测试使用danielfard--angular-file-upload JS库的代码时遇到问题。我的文件上传代码依赖于名为ngFileSelect (source for the directive here)的库中的指令。当我在浏览器中单击该过程时,这非常有效,但我无法在功能测试中触发它。

我有角度的HAML:

%input{ng: {"file-select" => "onFileSelect($files)"}, type: "file", multiple: true, id: "img-file-select"}

我尝试使用Capybara的attach_file方法。这不是文件,但通过观看数据库我可以告诉没有上传发生。

#does not fail but does not trigger upload
attach_file "img-file-select", 
  ["#{Rails.root}/spec/fixtures/images/property.jpg",
  "#{Rails.root}/spec/fixtures/images/kitchen.jpg"]

我还尝试使用trigger方法手动触发事件。这些确实失败了。

#these fail with with 'Capybara::Poltergeist::BrowserError: Unknown event [object Object]'
find("#img-file-select").trigger('ngFileSelect')
find("#img-file-select").trigger('fileSelect')
find("#img-file-select").trigger('change')

有没有办法从水豚测试中解雇这个指令?

2 个答案:

答案 0 :(得分:1)

以下是您可以做的事情:

page.execute_script <<-JS
  fakeFileInput = window.$('<input/>').attr({ id: 'fileFileInput', type: 'file' }).appendTo('body');
JS

page.attach_file('fakeFileInput', Rails.root.join('spec', 'fixtures', 'images', 'property.jpg'))

page.execute_script <<-JS
  var scope = angular.element('#img-file-select').scope();
  scope.files = [fakeFileInput.get(0).files[0]];
JS

答案 1 :(得分:0)

Capybara提供了一种执行任意javascript的方法。

page.evaluate_script('4 + 4');

看看here,但您应该可以使用此方法触发所需的任何javascript事件。