2015-09-21 3 views
1

У меня есть компонент боковой панели, который полагается на службу боковой панели, которая вводится в нее через инициализатор.Компонент Ember, не обновляющийся в тесте интеграции при инжектируемой услуге

компонент, то есть вычисленное право собственности, который привязан к тем же собственностям на службе:

title: function() { 
    return this.get('sideBarService.title'); 
}.property('sideBarService.title'), 

Это работает в самом приложении, но я не могу получить компонент для обновления в интеграционном тесте, когда обслуживание.

Вот мой не тест рабочей интеграции:

import Ember from 'ember'; 
import startApp from '../helpers/start-app'; 
import hbs from 'htmlbars-inline-precompile'; 
import { moduleForComponent, test } from 'ember-qunit'; 

var application, container, sideBarService; 

moduleForComponent('side-bar', 'Integration | side-bar',{ 
    integration: true, 
    beforeEach: function() { 
    application = startApp(); 
    container = application.__container__; 
    sideBarService = container.lookup('service:side-bar'); 
    }, 

    afterEach: function() { 
    Ember.run(application, 'destroy'); 
    } 
}); 

test('it displays the correct title', function(assert) { 
    assert.expect(1); 

    Ember.run(function() { 
    sideBarService.set('title', 'Hello'); 
    }); 

    this.render(hbs` 
    {{side-bar}} 
    `); 

    var content = this.$('.side-bar-content .title').text().trim(); 
    var serviceTitle = sideBarService.get('title'); 
    // fails  
    assert.deepEqual(content, serviceTitle); 
}); 

Интересно, если я отладки в тесте и захватить компонент с консолью, а затем захватить sideBarService от компонента, он осознает обновленное значение названия и даже название значения на самом компоненте, кажется, обновляются, но дом никогда не обновляется:

//debugged in browser console 
var sb = container.lookup('component:side-bar') 
undefined 

sb.get('title') 
"Hello" 

sb.get('sideBarService.title') 
"Hello" 

this.$('.title').text().trim() 
"" 

это вопрос цикла запуска? Если да, то что мне нужно сделать, чтобы настроить его?

Редактировать: Что касается комментария Торана. Правильно ли это выглядит?

var done = assert.async(); 
    var content = this.$('.side-bar-content .title').text().trim(); 
    var serviceTitle = sideBarService.get('title'); 
    setTimeout(function() { 
    assert.deepEqual(content, serviceTitle); 
    done(); 
    }); 
+0

часто ж/асинхронный код, который я нашел, что интеграционные тесты требуют «переменного сделано = assert.async()» плюс SetTimeout от 1 (тогда, когда я делаю утверждение и огнь проделанные() я могу убедитесь, что цикл событий выполнил задание, как ожидалось). Попробуйте это и сообщите мне, если это сработает/или вам понадобятся какие-то руки на помощь. –

+0

Я искренне ценю ответ, но не смотрю. Я добавляю фрагмент выше, чтобы показать, что я сделал на всякий случай, если я не назвал assert async правильно. – Andrew

+0

@ToranBillups. Я бы определенно предложил вам разобраться в этом больше! Есть ли лучший способ следить за вами? – Andrew

ответ

1

я бы, вероятно, идет о фиксации этого, избегая инъекции в инициализаторе и вместо того, чтобы с помощью Ember.inject.service помощника.

// component 

import Ember from 'ember' 

const { Component, inject, computed } = Ember; 
const { service } = inject; 
const { alias } = computed; 

export default Component.extend({ 

    sideBarService: service('side-bar'), 

    title: alias('sideBarService.title') 

}); 

Затем в вашем тесте вы можете передать услугу, когда используете этот компонент.

import Ember from 'ember'; 
import startApp from '../helpers/start-app'; 
import hbs from 'htmlbars-inline-precompile'; 
import { moduleForComponent, test } from 'ember-qunit'; 

var application, container, sideBarService; 

moduleForComponent('side-bar', 'Integration | side-bar',{ 
    integration: true, 
    beforeEach: function() { 
    application = startApp(); 
    }, 

    afterEach: function() { 
    Ember.run(application, 'destroy'); 
    } 
}); 

test('it displays the correct title', function(assert) { 
    assert.expect(1); 

    this.set('sideBarService', Ember.Object.create({ 
    title: 'hello' 
    })); 

    this.render(hbs` 
    {{side-bar sideBarService=sideBarService}} 
    `); 

    var title = this.$('.side-bar-content .title').text().trim(); 
    assert.equal(title, 'hello'); // Hopefully passes 
}); 
Смежные вопросы