2013-09-18 3 views
1

Попытка получить тесты с использованием QUnit и Teaspoon. У меня есть следующий тест:Интеграция Тестирование Ember: Как использовать Ember.run с ember-auth

test("Employee signs in", function(){ 
    visit("/").then(function(){ 
    return fillIn("#email", "[email protected]"); 
    }).then(function(){ 
    return fillIn("#password", "password"); 
    }).then(function(){ 
    return click("#button"); 
    }).then(function(){ 
    ok(find("span:contains('Some Text')").length, "Should see Some Text"); 
    }); 
}); 

Однако, когда я запускаю тест, я получаю эту ошибку:

You have turned on testing mode, which disabled the run-loop's autorun. You will need to wrap any code with asynchronous side-effects in an Ember.run 

Моих понять, что есть некоторый асинхронный код в моем приложении, которое должно быть обернуто в Ember.run, так как во время тестирования контур цикла отключен. Я использую уголек-авторизации, и я считаю, что следующий кусок кода, где асинхронном происходит на входе в систему:

submit: function(event, view) { 
    event.preventDefault(); 
    event.stopPropagation(); 
    App.Auth.signIn({ 
     data: { 
     email: this.get('email'), 
     password: this.get('password'), 
     remember: true, //this.get('remember') 

     } 
    }); 
    } 

Но я не уверен, как обернуть это в Ember.run и вещи, которые я имею до сих пор не работают. Как обернуть асинхронную часть этого кода в Ember.run, чтобы я мог выполнить тест?

ответ

0

Попробуйте обернуть в основном весь код в цикле уголька выполнения:

test("Employee signs in", function(){ 
    Ember.run(function(){ 
    visit("/").then(function(){ 
     return fillIn("#email", "[email protected]"); 
    }).then(function(){ 
     return fillIn("#password", "password"); 
    }).then(function(){ 
     return click("#button"); 
    }).then(function(){ 
     ok(find("span:contains('Some Text')").length, "Should see Some Text"); 
    }); 
    }); 
}); 

Надеется, что это помогает.

+0

Выполнение этого не сработало, и я слышал, что вы хотите только обернуть код, делающий асинхронный запрос в Ember.run. Может быть, потому, что мы используем ember-auth gem, я использую Ember.run на слишком высоком уровне? – John

0

ember-auth dev здесь.

Это не обеспечивает полностью то, что вы хотели, но я использую два подхода при тестировании этого в ember-authjasmine).

Первый способ - использовать API-интерфейс, как в these specs. В основном я перехожу к асинхронному вызову в синхронизацию, и при этом mock framework возвращает ответ немедленно для использования ember-auth.

beforeEach -> 
    $.mockjax 
    url: '/foo' 
    type: 'POST' 
    status: 200 
    # ... 
    Em.run -> doSomething() 

it 'is successful', -> 
    expect(foo).toBe bar 

(я использовал jquery-mockjax в спецификации.)

Второй способ игнорировать то, что ember-auth делает, а просто проверить, что вы назвали ожидаемый общественный API правильно, так как в these specs.

beforeEach -> 
    spy = sinon.collection.spy auth, 'signIn' 

it 'is successful', -> 
    expect(spy).toHaveBeenCalledWith(/* something */) 

Надеюсь, это поможет.

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