2015-07-10 83 views
5

我正在用React構建一個基本的博客應用程序。我正在使用Jasmine和Karma來運行我的前端測試。我得到了我的第一次測試啓動和運行,並將其傳遞在Chrome(鉻)和Firefox,但是當它運行在PhantomJS我得到以下錯誤:茉莉花測試通過Chrome和Firefox,但失敗PhantomJS

PhantomJS 1.9.8 (Linux 0.0.0) ERROR 
    TypeError: 'undefined' is not a function (evaluating 'ReactElementValidator.createElement.bind(
      null, 
      type 
     )') 
    at /home/michael/repository/short-stories/test/karma_tests/story_test.js:1742 

我的測試文件看起來像這樣:

var React = require('react/addons'); 
var Story = require('../../app/js/components/story.jsx'); 
var TestUtils = React.addons.TestUtils; 
var testUtilsAdditions = require('react-testutils-additions'); 

    describe('Story component', function() { 
    var component; 

    beforeEach(function() { 
     component = TestUtils.renderIntoDocument(React.createElement('story')); 
     component.props.storyTitle = 'front end test title'; 
     component.props.author = 'front end author'; 
     component.props.storyText = 'front end story text'; 
    }); 

    it('should display a story', function() { 
     expect(component.props).toBeDefined(); 
     expect(component.props.storyTitle).toBeDefined(); 
     expect(component.props.storyTitle).toBe('front end test title'); 
     expect(component.props.author).toBe('front end author'); 
     expect(component.props.storyText).toBe('front end story text') 
    }); 

    }); 

我嘗試刪除我的node_modules,並且npm緩存清除和npm安裝,但是它沒有修復它。我不確定我的測試如何在Firefox和Chrome中傳遞,但不在PhantomJS中傳遞。你可以在這裏看到完整的項目:https://github.com/mrbgit/short-stories。如果有更多信息可以幫助,請告訴我。任何幫助表示讚賞。謝謝!

回答

9

PhantomJS使用Qt-Webkit的一個相當舊的版本,它不提供Function.prototype.bind。這對很多圖書館來說都是一個問題,因此可以使用polyfill NPM module called 'phantomjs-polyfill'

如果您不想使用NPM模塊(如果您正在測試未與browserify/webpack捆綁在一起的瀏覽器網站),則在MDN頁面上提供以下bind的填充,您可以將它附加到你自己:

if (!Function.prototype.bind) { 
    Function.prototype.bind = function(oThis) { 
    if (typeof this !== 'function') { 
     // closest thing possible to the ECMAScript 5 
     // internal IsCallable function 
     throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 
    } 

    var aArgs = Array.prototype.slice.call(arguments, 1), 
     fToBind = this, 
     fNOP = function() {}, 
     fBound = function() { 
      return fToBind.apply(this instanceof fNOP 
       ? this 
       : oThis, 
       aArgs.concat(Array.prototype.slice.call(arguments))); 
     }; 

    fNOP.prototype = this.prototype; 
    fBound.prototype = new fNOP(); 

    return fBound; 
    }; 
} 
+0

謝謝ssube,修復它! – CascadiaJS