2014-09-29 21 views
6

Abbiamo avviato il processo di integrazione Reactjs nella nostra app Rails 4.1. Il fatto è che un sacco di funzionalità sono state interrotte ora.Capybara, Poltergeist e Reactjs - 'undefined' non è una funzione

Ecco stack per prove:

  • cetriolo
  • Capybara
  • Poltergeist (via phantomjs)
  • Rspec

Ad esempio, v'è la caratteristica cetriolo:

@javascript @services 

Feature: Manage Service 
    Scenario Outline: Publish and archieve 
    Given the individual user 
    When I visit services page 
    And I click on I18n translation for key "views.labels.add" 
    And I fill service's fields and choose price as "<price>" 
    And I click on I18n translation for key "<submit_btn>" 
    Then I should see I18n translation for key "<message>" 
    And Created service should have 1 tag 

    Examples: 
    | submit_btn     | price  | message          | 
    | views.labels.publish  | fixed  | views.messages.notices.add.created   | 
    | views.labels.publish  | negotiated | views.messages.notices.add.created   | 

Quando ho eseguito questo test poi vedo questo errore:

One or more errors were raised in the Javascript code on the page. If you don't care about these errors, you can ignore them by setting js_errors: false in your Poltergeist configuration (see documentation for details). 

    TypeError: 'undefined' is not a function (evaluating 'RegExp.prototype.test.bind(
     /^(data|aria)-[a-z_][a-z\d_.\-]*$/ 
    )') 
    TypeError: 'undefined' is not a function (evaluating 'RegExp.prototype.test.bind(
     /^(data|aria)-[a-z_][a-z\d_.\-]*$/ 
    )') 
     at http://127.0.0.1:53686/assets/application.js:32342 
     at http://127.0.0.1:53686/assets/application.js:28807 in s 
     at http://127.0.0.1:53686/assets/application.js:28807 
     at http://127.0.0.1:53686/assets/application.js:37581 
     at http://127.0.0.1:53686/assets/application.js:28807 in s 
     at http://127.0.0.1:53686/assets/application.js:28807 
     at http://127.0.0.1:53686/assets/application.js:32910 
     at http://127.0.0.1:53686/assets/application.js:28807 in s 
     at http://127.0.0.1:53686/assets/application.js:28807 in e 
     at http://127.0.0.1:53686/assets/application.js:47260 
     at http://127.0.0.1:53686/assets/application.js:28807 
     at http://127.0.0.1:53686/assets/application.js:47262 (Capybara::Poltergeist::JavascriptError) 
    ./features/step_definitions/service.steps.rb:16:in `/^the individual user$/' 
    features/service/new.feature:9:in `Given the individual user' 
+0

PhantomJS 1.x non ha 'Function.prototype.bind'. Avresti bisogno di un [shim] (https://github.com/ariya/phantomjs/issues/10522#issuecomment-39248521), ma non so come useresti lo shim per il tuo particolare stack tecnologico. Correlati: [bind polyfill per PhantomJS] (http://stackoverflow.com/questions/24224323/bind-polyfill-for-phantomjs). In CasperJS lo faresti come [questo] (http://stackoverflow.com/questions/25359247/casperjs-bind-issue). Se trovi una risposta, non dimenticare di rispondere alla tua stessa domanda. –

risposta

7

ho trovato la soluzione. È necessario utilizzare shim per quello. Ho messo il file in vendor/assets/javascripts/es5-shim.js.

Dopo questo è necessario iniziare questo spessore. Si noti che lo shim dovrebbe andare PRIMA di init del react, è fondamentale!

application.js

//= require es5-shim 
//= require react 
//= require react_ujs 

Dopo che i test hanno cominciato a lavorare di nuovo.

+0

grazie! Funziona! –