2015-12-03 5 views
3

Im с использованием 1.0.0-beta.1 Aurelia и попытайтесь написать некоторые модульные тесты.Тестирование aurelia customElement с привязкой и зависимостями

У меня есть customElement вроде этого:

... 
@inject(BindingEngine, Class1, Class2) 
export class MyElement{ 

@bindable data; 

constructor (bindingEngine, class1, class2) { 
    ... 
} 
... 

И я хочу, чтобы создать тестируемый экземпляр MyElement с Mocks из Class1 & class2 и рабочих данных Привязываемое поля.

Что я узнал - до сих пор, что примеры с BehaviorInstance больше не работают из-за изменений API described here.

Посмотрев в Tests from aurelia-templating, мой подход выглядит какой-то вроде этого:

import {TemplatingEngine} from 'aurelia-templating'; 
import {Container} from 'aurelia-dependency-injection'; 
import {BindingEngine} from 'aurelia-binding'; 

import { Class1Mock, Class2Mock } from './myMocks'; 

describe('The MyElement customElement',() => { 
    let container; 
    let bindingEngine; 
    let templateEngine; 

    let myElement; 

    beforeEach(() => { 
     container = new Container(); 

     //Add my mocks to DI container? 
     container.registerInstance('Class1', new Class1Mock()); 
     container.registerInstance('Class2', new Class2Mock()); 

     templateEngine = container.get(TemplatingEngine); 
     bindingEngine = container.get(BindingEngine); 

     myElement = templateEngine.createViewModelForUnitTest(MyElement); 
    } 

    it('should be initialized', (done) => { 

     expect(myElement).not.toBe(null); 
     expect(myElement).not.toBe(undefined); 
     done(); 
    }); 
} 

Он проваливается уже запрашивающий bindingEngine от DI контейнера или когда оставлено при создании MyElement-VieModel

Error: Error invoking TaskQueue. Check the inner error for details. 
    ------------------------------------------------ 
    inner error: TypeError: _aureliaPal.DOM.createMutationObserver is not a function 
     at makeRequestFlushFromMutationObserver (.../jspm_packages/npm/[email protected]/aurelia-task-queue.js:13:36) 
     at new TaskQueue (.../jspm_packages/npm/[email protected]/aurelia-task-queue.js:59:41) 
     at Object.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:334:14) 
     at InvocationHandler.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:309:168) 
     at Container.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:557:25) 
     at StrategyResolver.get (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:145:37) 
     at Container.get (../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:488:41) 
     at Object.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:354:33) 
     at InvocationHandler.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:309:168) 
     at Container.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:557:25) 
     at StrategyResolver.get (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:145:37) 
     at Container.get (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:488:41) 
     at Object.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:354:33) 
     at InvocationHandler.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:309:168) 
     at Container.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:557:25) 
     at StrategyResolver.get (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:145:37) 
     at Container.get (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:488:41) 
     at new AggregateError (.../jspm_packages/npm/[email protected]/aurelia-pal.js:20:13) 
     at Container.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:559:15) 
     at Object.invoke (.../jspm_packages/npm/[email protected]/aurelia-dependency-injection.js:344:33) 

Итак, как мне это сделать правильно?

------ Edit:

Ответ от Michael Malone работает отлично. Для любого, кто пришел на этот вопрос, это как мой пример работы:

import {TemplatingEngine} from 'aurelia-templating'; 
import {Container} from 'aurelia-dependency-injection'; 
import {BindingEngine} from 'aurelia-binding'; 
import {initialize} from 'aurelia-pal-browser'; 

import { Class1Mock, Class2Mock } from './myMocks'; 

describe('The MyElement customElement',() => { 
    let container; 
    let bindingEngine; 
    let templateEngine; 

    let myElement; 

    initialize(); 

    beforeEach(() => { 
     container = new Container(); 

     //Add my mocks to DI container? 
     container.registerInstance('Class1', new Class1Mock()); 
     container.registerInstance('Class2', new Class2Mock()); 

     templateEngine = container.get(TemplatingEngine); 
     bindingEngine = container.get(BindingEngine); 

     myElement = templateEngine.createViewModelForUnitTest(MyElement); 
    } 

    it('should be initialized', (done) => { 

     expect(myElement).not.toBe(null); 
     expect(myElement).not.toBe(undefined); 
     done(); 
    }); 
} 

ответ

5

Где-то в ваших тестах, что вам нужно сделать это:

import {initialize} from 'aurelia-pal-browser'; 

initialize(); 

(как это выполняется рядный, это просто необходимо чтобы быть где-то в ваших тестах. У нас есть это в отдельном файле initialize.spec.js)

+0

Спасибо! Наконец ... =) Ты мой герой дня! – jmenzel

Смежные вопросы