2015-02-24 2 views
3

Я пишу тест для функции, которая возвращает обещание, и я не могу запускать утверждения для разрешения или отклонения обещания. Я не могу использовать ES6 для этого проекта, поэтому я использую библиотеку rsvp.js, которая утверждает, что реализует спецификацию Promises/A +. Я использую последнюю версию QUnit 1.17.1Как выполнять утверждения qunit при разрешении обещания

функция тестируемой:

var loadGroups = function(data) { 
    return new RSVP.Promise(function(resolve, reject) { 
     var groups = []; 
     // ... some code to populate the groups array 
     if(groups.length > 0) { 
      resolve(groups); 
     } else { 
      reject("No groups were loaded"); 
     } 
    }); 
}; 

Испытание успеха:

test('success test', function(assert) { 
    assert.expect(1); 

    var promise = loadGroups(testData); 

    promise.then(function(groups) { 
     assert.deepEquals(groups.length, 1); 
    }); 

    return promise; 
}); 

Это терпит неудачу с «ожидаемыми 1 утверждений, но 0 были проведены «


The fa Тест ilure:

test('failure test', function(assert) { 
    assert.expect(1); 

    var promise = loadGroups([]); 

    promise.then(null, function(message) { 
     assert.equals(message, "No groups were loaded"); 
    }); 

    return promise; 
}); 

Это терпит неудачу с «Promise отвергнута во ПОЛУЧИТЬ обещание при загрузке пустых групп: Нет группы были загружены»

ответ

10

обещает работать приковав. Обещания - это неизменные обертки над значениями.

Когда вы делаете:

promise.then(function(e){ 
    // do something 
}); 

Вы не изменяете promise вы создаете новое обещание вместо этого. Вместо этого, вы должны приковать обещание:

test('success test', function(assert) { 
    assert.expect(1); 

    var promise = loadGroups(testData); 

    // return the `then` and not the original promise. 
    return promise.then(function(groups) { 
     assert.deepEquals(groups.length, 1); 
    }); 

}); 
+0

Я мог бы понять это во втором случае (когда тест запущенной может ожидать правдивое обещание), но в первом случае утверждение всегда должно быть выполнено перед испытанием бегуна сообщается, что обещание разрешено? – Bergi

+0

@ Bergi помню, о каком тестируемом бегуне мы говорим, что обещает, что он построен, и каких гарантий им не хватает :) –

+0

Я не знаю Qunit, но при условии, что он регистрирует свой обработчик 'then', чтобы получать уведомление о разрешении, обещания гарантировали бы выполнение этого утверждения до этого. – Bergi

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