量角器在没有done()方法的情况下没有通过我的测试

时间:2016-04-18 14:25:02

标签: angularjs testing protractor angularjs-e2e

我实际上正在完成Angular应用程序的单元测试。我目前正在使用Protractor和Jasmine进行E2E测试。不幸的是,我有以下问题:

我在网上进行了大量研究,例如http://ramonvictor.github.io/protractor/slides/#/1,我显然从未看到使用“完成”回调来启动测试。

第一次测试在createUser页面上进行,并确保用户选项卡属性设置为活动。它仅在我使用done方法时传递,我不应该使用它。

'use strict';

var UserCreate = require('./page-objects/userCreate.pageObjects');

describe('on init', function () {

    beforeEach(function() {
       var rootUrl = browser.baseUrl + '/#/users/create';
       browser.driver.get(rootUrl);
    });

    it('should set the user tab active', function(done) { // DONE callback
        UserCreate.tabs.getAttribute('class').then(function(value) {
            expect(value).toEqual('active');
            done(); // calling callback
        });
     });
 });

如果我在不使用done()的情况下重复相同的测试,即使这次测试也通过,我希望失败

'use strict';

var UserCreate = require('./page-objects/userCreate.pageObjects');

describe('on init', function () {

    beforeEach(function() {
       var rootUrl = browser.baseUrl + '/#/users/create';
       browser.driver.get(rootUrl);
    });

    it('should set the user tab active', function() {
        UserCreate.tabs.getAttribute('class').then(function(value) {
            expect(value).toEqual('activeWRONG');
        });
     });
 });

只有在我使用完成回调时才会失败。

这是我的配置文件:

 /* conf.js */
'    use strict';

exports.config = {
rootElement: '#myApp',
directConnect: true,
seleniumAddress: 'http://localhost:4444/wd/hub',
capabilities: {
    browserName: 'chrome',
    shardTestFiles: true,
    maxInstances: 1
},
framework: 'jasmine',
// specs: ['./*.spec.js'],
baseUrl: 'http://localhost:9001',
defaultTimeoutInterval: 0000,
jasmineNodeOpts: {
    showColors: true,
},
suites: {
    wip:        './userCreate.spec.js',
    all:        './*spec.js'
},
onPrepare: function() {
    browser.driver.get('http://localhost:9001/#/');
    element(by.id('ld-link-login')).click();
    browser.sleep(500);

    element(by.model('username')).sendKeys('test');
    element(by.model('password')).sendKeys('test');
    element(by.id('nv-login-submit')).click();

    return browser.driver.wait(function() {
        return browser.driver.getCurrentUrl().then(function(url) {
            return /dashboard/.test(url);
        });
    }, 10000);
}
};

我在更深入的测试中遇到了异步问题,并且在任何地方都使用了,所以我想在继续我的测试之前解决这个问题。

感谢您的帮助。

修改:

量角器版本:./ node_modules / .bin/protractor --version提供版本3.2.2

userCreate.pageObjects:

'use strict';

 module.exports = {
    tabs: element(by.id('cc-tab-user'))
  };

5 个答案:

答案 0 :(得分:0)

这是预期的行为。如果您不要求done()函数,jasmine会将您的测试视为同步并完成而不等待承诺得到解决。 当你提出要求时,你的测试变得异步,如果在超时之前没有调用done()(默认为5秒),它将失败 有关详细信息,请参阅:http://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support

答案 1 :(得分:0)

您在使用承诺解析顺序定义导致问题的页面对象的方式上存在问题。关注style guide并将其更改为:

var UserCreatePage = function() {
  this.tabs = element(by.id('cc-tab-user'));
};

module.exports = UserCreatePage;

用法:

'use strict';

var UserCreatePage = require('./page-objects/userCreate.pageObjects');

describe('on init', function () {
    var userCreatePage;

    beforeEach(function() {
       var rootUrl = browser.baseUrl + '/#/users/create';
       browser.driver.get(rootUrl);

       userCreatePage = new UserCreatePage();
    });

    it('should set the user tab active', function() {
        userCreatePage.tabs.getAttribute('class').then(function(value) {
            expect(value).toEqual('activeWRONG');
        });
     });
 });

答案 2 :(得分:0)

如果测试在测试的控制流中创建并行TaskQueue,则会发生此行为。对于what done() is for and how to use it ( protractor, jasmine),我写了一些测试结果的例子,因为这个结果不一致。

要确定这是否是您的问题,您可以在测试的各个点打印出控制流程:

console.log(protractor.promise.controlFlow().getSchedule(false));

答案 3 :(得分:0)

您的问题是,您使用then()value语句传递expectthen()创建一个新的异步任务,将其作为子任务删除。因此,您的it首先完成result = success,然后执行expect-statement。 它已记录在Promise/ControlFlow documentation of Selenium

由于expect()已取消/解决承诺,因此您无需then()

使用done它可行,因为您可以控制执行并阻止itthen()完成之前继续/完成。

试试这个:

'use strict';

var UserCreate = require('./page-objects/userCreate.pageObjects');

describe('on init', function () {

    beforeEach(function() {
       var rootUrl = browser.baseUrl + '/#/users/create';
       browser.driver.get(rootUrl);
    });

    it('should set the user tab active', function() {
        expect(UserCreate.tabs.getAttribute('class')).toEqual('activeWRONG');
    });
});

答案 4 :(得分:0)

这是因为控制流程在代码中无法正常运行。控制流程基于任务和任务队列的概念。任务是定义要执行的控制流的基本工作单元的功能。每个任务都通过ControlFlow#execute()进行调度,它将返回一个ManagedPromise,它将使用任务的结果进行解析。

以下内容应该有效。

let UserCreate = require('./pageobject.page.js');
describe('should navigate to url', function () {
    beforeEach(function() {
      url = `${browser.baseUrl}/#/users/create`;
      browser.driver.get(url);
    });
    it('should set the user tab active', function() {
   expect(UserCreate.tabs.getAttribute('class')).toEqual('activeWRONG');
    });
});