2015-07-11 19 views
8

Ho un ember-cli 0.2.7 utilizzando Ember.js 1.12.0 app con un pezzo di codice che assomiglia:Come testare String.prototype.includes in 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')); 
    }) 
}); 

Passa attraverso tutti gli oggetti nel modello e restituisce true se la proprietà della categoria contiene "calzature".

sto cercando di testare in questo modo:

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"'); 
}); 

il codice funziona come dovrebbe quando si esegue l'applicazione, ma a quanto pare PhantomJS non riconosce il metodo di .includes. (Il metodo è documentato qui String.prototype.includes()

Come posso ottenere PhantomJS per riconoscere il metodo .includes?

Grazie!

+0

'includes' è implementato ora solo in Chrome. Il tuo codice non può funzionare in Firefox, Safari e IE così come in PhantomJS –

+0

Gestito per farlo funzionare utilizzando un polyfill. Testato in FF, Safari e PhantomJS e ha funzionato. – zshnr

risposta

8

Apparentemente PhantomJS non implementa ES6 dispone correttamente. Per fortuna String.prototype.includes è abbastanza facile da polyfill . è possibile scegliere se si vuole fare che nella suite di test o il controller il codice polyfill è:.

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

possibile mettere a destra prima della chiamata assert (si potrebbe vuoi usare una bandiera per ricordare di aver aggiunto il polyfill e rimuoverlo dopo lo assert), o farlo nel modulo stesso, prima o dopo il blocco export.

+0

@Amit c'è un polyfill generico di phantomjs es6 che funziona? Ho provato babel-core, es6-shim e non risolvono tutti il ​​problema 'include' ... –

+0

@MohamedElMahallawy - Non so che ce ne sia uno, ma questo non significa che non ci sia. Sono stato semplicemente in grado di trovare una soluzione semplice al problema particolare in questo caso. – Amit

6

Mentre la risposta selezionata è corretta, penso che valga la pena notare che l'aggiunta di questo nel test specifico non è sufficiente per la maggior parte delle app; Io suggerirei di creare un vendor/phantom-js-polyfills.js che contiene questo polyfill (più eventuali altri che sorgono lungo la linea) e poi all'interno del vostro ember-cli-build.js è possibile caricare in modo condizionale in:

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

Ho finito per utilizzare un polyfill nell'app in modo simile perché volevo anche supportare i browser che non utilizzavano questo metodo (come Safari) – zshnr

+1

Penso che in aggiunta, puoi usare plugin come questo da includere nel tuo test suite, nei tuoi file compilati o forse semplicemente includilo nell'index.html: https://github.com/mathiasbynens/String.prototype.includes –

+0

Sì, probabilmente è eccessivo. Ho messo i polyfill per phantomJS in 'tests/test-helper.js'. Dovrò controllarlo quando aggiornerò Ember occasionalmente, ma mi piace sempre meno parti mobili. –