Assert (false) внутри асинхронного обработчика xhr асинхронного внутреннего теста не проходит тест

StackOverflow https://stackoverflow.com//questions/23040070

Вопрос

Я написал тест для стажеров, который выполняет некоторые вызовы xhr (вход в систему, получение данных), которые зависят друг от друга.Итак, я вложил их, но все еще надеюсь, что смогу использовать chai библиотека утверждений внутри моих обработчиков.

Я обнаружил, что тест не провален должным образом, он всегда зависает и, наконец, стажер сообщает:

FAIL: main - MySuite - Make some async requests.. (10012ms)
CancelError: Timeout reached on main - MySuite - Make some async requests..

Это несмотря на наличие строки кода: assert(false, 'Oh no, something went wrong'); что выполняется.

Судя по тому, что я видел внутри библиотеки утверждения, она генерирует исключения, которые, как ожидается, будут перехвачены выше в стеке вызовов, но этот подход не подходит для стека вызовов обработчика асинхронных запросов.

Могу ли я использовать функции стиля Assert() на этом этапе кода, или я вынужден отклонить исходный dfd, предоставленный мне this.async(timeout)?

Этот вопрос отличается от Асинхронный тест не выдает ошибку при сбое в том, что он неправильно использовал исходный dfd из this.async() ..Я пытаюсь не использовать это, а вместо этого использовать абстракции более высокого уровня библиотеки утверждений chai.

Мой упрощенный тестовый модуль:

/*jshint dojo:true */
/*global console:true */
'use strict';
define([
    'intern!tdd',
    'intern/chai!assert',
    'intern/dojo/request'
], function (test, assert, request) {

    console.log('Test has started to run.');
    var testTimeout = 10000;

    test.suite('MySuite', function () {
        test.test('Make some async requests..', function () {
            var dfd = this.async(testTimeout);

            var promise = request('http://dojotoolkit.org/js/dojo/1.8/release/dtk/dijit/themes/claro/claro.css')
            .then(function (res) {

                console.log('First request OK: ', res.length, ' chars.');
                // Make a second request
                request('http://dojotoolkit.org/css/print.css')
                .then(function (res2) {

                    console.log('Second  request OK: ', res2.length, ' chars.');

                    // Now pretend we hit an error
                    console.log('Faking an assert fail...');
                    assert(false, 'Oh no, something went wrong');

                    // We would have got here if it weren't for those pesky assertions
                    dfd.resolve('test passed');
                }, function (err) {
                    // Record the error
                    console.log('Inner Error handler was hit: ', err);
                    //Error Callback
                    //Ensure no HTTP errors raised.
                    dfd.reject.bind(dfd);
                });
            },

            function (err) {
                // Record the error
                console.log('Outer Error handler was hit: ', err);
                //Error Callback
                //Ensure no HTTP errors raised.
                dfd.reject.bind(dfd);
            });
        });
    });

});

стажер.js:

// Learn more about configuring this file at <https://github.com/theintern/intern/wiki/Configuring-Intern>.
// These default settings work OK for most people. The options that *must* be changed below are the
// packages, suites, excludeInstrumentation, and (if you want functional tests) functionalSuites.
define([ 'intern/node_modules/dojo/has' ], function (has) {
    has.add('dojo-has-api', true);

    return {
        // Configuration options for the module loader; any AMD configuration options supported by the specified AMD loader
        // can be used here
        loader: {
            // Packages that should be registered with the loader in each testing environment
            packages: [
                'node',
                { name: 'testing', location: '.' }
            ]
        },

        // Non-functional test suite(s) to run in each browser
        suites: [ 'testing' /* 'myPackage/tests/foo', 'myPackage/tests/bar' */ ]

    }
});

вывод оболочки:

neek@alyssa:~/src/WIN/testing$ node node_modules/.bin/intern-client config=intern suites=internpromises
Defaulting to "console" reporter
Test has started to run.
First request OK:  135540  chars.
Second  request OK:  135540  chars.
Faking an assert fail...
FAIL: main - MySuite - Make some async requests.. (10009ms)
CancelError: Timeout reached on main - MySuite - Make some async requests..
    at Error (<anonymous>)
Это было полезно?

Решение

В асинхронных тестах вам необходимо обернуть функции обратного вызова, используя dfd.rejectOnError(callback) если вы просто хотите, чтобы тест завершился неудачно при сбое утверждения, или dfd.callback(callback) если вы хотите, чтобы тест завершился неудачей, если утверждение не выполнено, или успешным, если ни одно утверждение не завершилось неудачно.См. асинхронное тестирование часть документации для получения дополнительной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top