Внутренний асинхронный тест

Я пытаюсь заставить работать асинхронный стажер-тест, используя отдельный модуль для выполнения вызова запроса. У меня проблема с возвратом true после завершения теста, потому что я всегда получаю ошибку тайм-аута, даже если запрос выполнен успешно, и тест выполняется до завершения. После запуска теста он просто сидит на последней странице и истекает время ожидания. login_test.js — тестовый файл, companyCreate — файл вызова запроса, существующий во внешнем модуле. Я не совсем уверен, что происходит с моим тестовым обратным вызовом, если я передам его в deferred.callback().

// login_test.js
define([
'intern!object',
'pages/loginpage',
'runtime/testConfig',
'intern/dojo/node!nconf',
'helpers/companyCreate',
'locators/loginpage',
'locators/companyselectionpage'

], function(registerSuite, LoginPage, conf, nconf, Company) {

var tests = {

    name: 'Login test',

    'Test': function() {

        /* make a call to create a company
        * param1: test function to run after we get response with login details
        * param2: intern object so we can make it async
        */
        Company.createCompany(function(response, testObj) {

            testObj.timeout = 120000; //The default timeout is 30 seconds. Not enough

            var region = nconf.get("region"); //Getting command line region value
            var regionData = conf.get(region); //Fetching  config data based on region
            var loginId = regionData.LOGIN;
            var password = regionData.PASSWORD;

            var loginPage = new LoginPage(testObj.remote, regionData.DEFAULT_TIMEOUT);

            var companySelectionPage = loginPage
                .load(regionData.BASE_URL)
                .loginIn(loginId, password);
            var homePage = companySelectionPage
                .doesCurrentURLContain('/companysel')
                .isTitlePresent()
                .selectCompany(CompanySelectionLocators.data);
            return homePage
                .doesCurrentURLContain('/homepage')
                .getAccumulatedState();
        }, this);
    }
};

registerSuite(tests);
});

>

// companyCreate.js
define(function(require) {
var request = require('intern/dojo/request');

var Company = {

    createCompany: function(callbackArg, testObj) {
        // tell intern this is async
        var deferred = testObj.async(120000);

        // make post
        request.post('https://internal.com/createcompany', {
            query: {
                version: ".0.1",
                special: "true"
            },
            data: JSON.stringify({
                userName: "Test",
                password: "pass",
                userEmail: "[email protected]"
            }),
            headers: {
                'Content-Type': "application/json"
            }
        }).then(function(response) {
            // success, tell intern async is done, return test function to run and pass it the response
            console.log(response);
            return deferred.callback(callbackArg(response, testObj));
        }, function(err) {
            console.log(err);
        }, function(evt) {
            //console.log(evt);
        });
    }
};

return Company;
});

person mziemer    schedule 12.06.2015    source источник


Ответы (2)


deferred.callback предназначен для переноса другого обратного вызова, который выполняется в другое время. Он не разрешает базовый промис, он возвращает новую функцию, которая при вызове разрешает промис, если переданная функция обратного вызова не выдает ошибку. Например:

'Test': function () {
  var dfd = this.async();

  // this use of `dfd.callback`…
  fs.readFile('foo.txt', dfd.callback(function (error, data) {
    if (error) {
      throw error;
    }

    assert.strictEqual(data, 'hello, world');
  }));

  // …is equivalent to this without it:
  fs.readFile('foo.txt', function (error, data) {
    if (error) {
      dfd.reject(error);
      return;
    }

    try {
      assert.strictEqual(data, 'hello, world');
    }
    catch (error) {
      dfd.reject(error);
      return;
    }

    dfd.resolve();
  }));
}

Вы должны использовать deferred.resolve, который преобразует обещание в значение, переданное в качестве первого аргумента. Подробнее о каждой из этих функций см. в документации по асинхронным тестам.

person C Snover    schedule 13.06.2015

Рабочее решение ниже. У меня не было необходимости в this.async. comapnyCreate.js возвращает ответ и обещание из запроса. login_test.js запускает тест после выполнения обещания. (все еще нужна логика обработки ошибок)

// login_test.js
define([
    'intern!object',
    'pages/loginpage',
    'runtime/testConfig',
    'intern/dojo/node!nconf',
    'helpers/companyCreate',
    'locators/loginpage',
    'locators/companyselectionpage'

], function(registerSuite, LoginPage, conf, nconf, Company) {

var tests = {

    name: 'Login test',

    'Test': function() {

        this.timeout = 60000;
        var remote = this.remote;

        return Company.createCompany().then(function(response) {

            var region = nconf.get("region"); //Getting command line region value
            var regionData = conf.get(region); //Fetching  config data based on region
            var loginId = regionData.LOGIN;
            var password = regionData.PASSWORD;

            var loginPage = new LoginPage(remote, regionData.DEFAULT_TIMEOUT);

            var companySelectionPage = loginPage
                .load(regionData.BASE_URL)
                .loginIn(loginId, password);
            var homePage = companySelectionPage
                .doesCurrentURLContain('/companysel')
                .isTitlePresent()
                .selectCompany(CompanySelectionLocators.data);
            return homePage
                .doesCurrentURLContain('/homepage')
                .getAccumulatedState();
        });
    }
};

registerSuite(tests);
});

// companyCreate.js
define(function(require) {
var request = require('intern/dojo/request');

var Company = {

    createCompany: function() {
        // make post
        return request.post('https://internal.com/createcompany', {
            query: {
                version: ".0.1",
                special: "true"
            },
            data: JSON.stringify({
                userName: "Test",
                password: "pass",
                userEmail: "[email protected]"
            }),
            headers: {
                'Content-Type': "application/json"
            }
        });
    }
};

return Company;
});
person mziemer    schedule 15.06.2015