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')
有没有办法从水豚测试中解雇这个指令?
答案 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事件。