如何在我的jasmine / protractor测试中执行打字稿样式继承?

时间:2017-02-03 13:24:59

标签: angular typescript jasmine protractor

在我的项目中,我使用量角器+茉莉+ TypeScript进行e2e测试。我已经在我的页面对象文件中受益于TypeScript继承的荣耀(例如,我得到了一些BasePageObject类,其中包含从其中派生其余PageObjects的常用方法/对象。我想在我的测试中介绍相同的方法。这里是我现在得到的示例代码:

测试套件A [ATest.ts]:

import {
     SomePage,
     LoginPage
} from '../pages';


describe('test suite A', () => {
    let loginPage: LoginPage = new LoginPage();
    let somePage: SomePage = new SomePage();

    beforeAll(() => {
        loginPage.login();
        somePage.navigateTo();
    });

    it('my test 1', () => {
        //test body, assertions etc.
    });

    it('my test 2', () => {
        //test body, assertions etc.
    });
});

测试套件B [BTest.ts]:

import {
     AnotherPage,
     LoginPage
} from '../pages';


describe('test suite B', () => {
    let loginPage: LoginPage = new LoginPage();
    let anotherPage: AnotherPage = new AnotherPage();

    beforeAll(() => {
        loginPage.login();
        anotherPage.navigateTo();
    });

    it('my test 1', () => {
        //test body, assertions etc.
    });

    it('my test 2', () => {
        //test body, assertions etc.
    });
});

如您所见,某些代码对于两个套件都很常见。我希望在我的TC中实现继承,在Java Style中编写更多内容并避免代码重复(例如):

class BaseTestCase {
    beforeAll() {
        loginAction();
    }
}

class TestA extends BaseTestCase {
     beforeAll() {
         specificStuff();
     }
}

class TestB extends BaseTestCase {
     beforeAll() {
         specificStuff();
     }
}

茉莉花有可能吗?

2 个答案:

答案 0 :(得分:2)

您可以创建一个基类并轻松扩展它,然后用函数替换回调。

export abstract class BaseTest {
  abstract loginAction(): void;
  abstract specificStuff(): void;
}

export class FooTest extends BaseTest {
  loginAction(): void {
    // does stuff to login
  }
  specificStuff(): void {
    // do tests and expectations
  }
}

在你的测试中:

// Do some importing for FooTest.

describe('test suite A', () => {
  let fooTest = new FooTest();

  beforeAll(fooTest.loginAction);

  it('should do some specific stuff', fooTest.specificStuff);
});

你应该这样做吗?

可以这样做;但是,这是你想做的事吗?我想你的FooTest类方法会对测试做出一些期望。这(在我看来)并不是一个好的模式。您的it块应该包含您的期望,而不是将其取出。

答案 1 :(得分:0)

此“茉莉花描述替代”看起来很有希望,但请尝试一下: https://ajsblackbelt.wordpress.com/2016/05/06/jasmine-describe-override/

(此代码尚未经过测试)

global.myDescribe = function (name, arg1, arg2, suite) {
  describe(name, function){
    _myDescribeLogic(name, arg1, arg2, suite);
  }
};

function _myDescribeLogic(name, arg1, arg2, suite) {
  beforeAll(function (done) {
    // code
  });
  beforeEach(function (done) {
    // code
  });

  afterAll(function (done) {
    // code
  });
  afterEach(function (done) {
    // code
  });
}

将此添加到量角器配置文件中:

onPrepare: 'src/framework/myOnPreapre.js'

然后这应该起作用:

myDescribe('a suite', 'foo', 'bar', function(){
  it('should test a business function', function(){
    // code
  })
})

别忘了扩展x-和fdescribe,如文章所述。


我为什么要这样做? 因为对于每个测试来说,有些事情总是一样的,例如登录(是的,期望登录测试,但不包括在登录测试中)。而且我不想在文件之间复制并浪费必要的*()。

应该在适当的位置定义此类Generell内容,并希望它能够无错误使用(例如在复制,粘贴和修改过程中忘记某些内容或出错)。

对我来说,一遍又一遍地读取相同的代码行的声音。它使测试更加不可读。 我只想阅读测试的特定内容。其他一切都是上下文。如果测试是关于编写和保存文本的,我不在乎登录。

出于不同的原因,我不喜欢茉莉花/量角器测试基于独立文件。对我来说,一个文件中的测试只是一个子套件。 “真实”套件是我所有的测试文件。