2015-07-11 19 views
8

Tôi có một ember-cli 0.2.7 sử dụng Ember.js 1.12.0 ứng dụng với một đoạn mã mà trông giống như:Làm thế nào để kiểm tra String.prototype.includes trong PhantomJS

controllers/cart.js

import Ember from 'ember'; 

export default Ember.Controller.extend({ 

    footwearInCart: Ember.computed('[email protected]', function() { 
     return this.get('model').any(product => product.get('category').includes('Footwear')); 
    }) 
}); 

Nó đi qua tất cả các đối tượng trong mô hình và trả về true nếu thuộc tính thể loại của chúng có 'giày' trong đó.

Tôi đang cố gắng để kiểm tra nó như vậy:

tests/unit/controllers/cart-test.js

import { moduleFor, test } from 'ember-qunit'; 
import Ember from 'ember'; 

var products = [Ember.Object.create({name: 'shoe', category: 'Footwear', subTotal: 10}), Ember.Object.create({name: 'shirt', subTotal: 20})]; 

var model = Ember.ArrayProxy.create({ 
    content: Ember.A(products) 
}); 

moduleFor('controller:cart', { 
    beforeEach() { 
    this.controller = this.subject(); 
    } 
}); 

test('footwearInCart property works', function(assert) { 
    this.controller.set('model', model); 

    assert.equal(this.controller.get('footwearInCart'), true, 'The footwearInCart function returns true if the category property of product in cart contains the word "Footwear"'); 
}); 

Mã này hoạt động theo cách đó nên khi tôi chạy ứng dụng, nhưng PhantomJS dường như không nhận ra phương pháp .includes. (Phương pháp này được ghi chép lại đây String.prototype.includes()

Làm thế nào tôi có thể nhận được PhantomJS để nhận ra phương pháp .includes?

Cảm ơn!

+0

'includes' hiện chỉ được triển khai trong Chrome. Mã của bạn không thể hoạt động trong Firefox, Safari và IE cũng như trong PhantomJS –

+0

Được quản lý để làm cho nó hoạt động bằng cách sử dụng một polyfill. Thử nghiệm nó trong FF, Safari, & PhantomJS và nó hoạt động. – zshnr

Trả lời

8

Rõ ràng PhantomJS không thực hiện ES6 tính năng đúng. May mắn String.prototype.includes là khá dễ dàng để polyfill . bạn có thể chọn nếu bạn muốn làm điều đó trong các bộ kiểm tra hoặc bộ điều khiển mã polyfill là:.

if (!String.prototype.includes) { 
    String.prototype.includes = function() {'use strict'; 
    return String.prototype.indexOf.apply(this, arguments) !== -1; 
    }; 
} 

hoặc đặt nó ngay trước khi assert cuộc gọi (bạn có thể muốn sử dụng một lá cờ để ghi nhớ về bạn đã thêm phần chèn vào và loại bỏ nó sau assert), hoặc làm điều đó trong chính mô đun, trước hoặc sau khối export.

+0

@Amit là có một phantomjs chung es6 polyfill hoạt động? Tôi đã thử babel-core, es6-shim và tất cả họ không giải quyết vấn đề 'bao gồm' ... –

+0

@MohamedElMahallawy - Tôi không biết rằng có một, nhưng điều đó không có nghĩa là không có. Tôi chỉ đơn giản là có thể tìm thấy một giải pháp đơn giản cho vấn đề cụ thể trong trường hợp này. – Amit

6

Trong khi câu trả lời được chọn là chính xác, tôi nghĩ đáng lưu ý rằng việc thêm điều này vào thử nghiệm cụ thể là không đủ tốt cho hầu hết các ứng dụng; Tôi muốn khuyên bạn nên tạo một vendor/phantom-js-polyfills.js chứa polyfill này (cộng với bất kỳ người khác mà đi lên xuống dòng) và sau đó bên trong bạn ember-cli-build.js bạn có thể có điều kiện tải nó tại:

if (EmberApp.env() === 'test') { 
    app.import('vendor/phantom-js-polyfills.js'); 
    } 
+0

Tôi kết thúc bằng cách sử dụng một polyfill trong ứng dụng theo cách tương tự vì tôi cũng muốn hỗ trợ các trình duyệt không sử dụng phương pháp này (như safari) – zshnr

+1

Tôi nghĩ ngoài ra, bạn có thể sử dụng các plugin như thế này để được đưa vào thử nghiệm của mình bộ, trong các tệp đã biên dịch của bạn hoặc có thể chỉ cần bao gồm nó trong index.html: https://github.com/mathiasbynens/String.prototype.includes –

+0

Vâng, đây có lẽ là quá mức cần thiết. Tôi đặt các polyfills cho phantomJS trong 'tests/test-helper.js'. Tôi sẽ phải kiểm tra nó khi tôi nâng cấp Ember đôi khi, nhưng tôi luôn luôn thích các bộ phận chuyển động ít hơn. –

Các vấn đề liên quan