在beforeAll中进行异步调用

时间:2015-09-24 18:23:15

标签: jasmine protractor

以下是同一测试的2个样本。唯一的区别是第一个使用describe('Async car test', function () { var cars; beforeAll(function (done) { // getCars() is a promise which resolves to ['audi', 'bmw'] getCars().then(function (data) { cars = data; console.log(cars) // ['audi', 'bmw'] done(); }); }); cars.forEach(function (car) { it('car ' + car, function () { expect(car).toBe(car); }); }); }); 块中的promise为变量赋值,而第二个赋值直接赋值。

我提出了一个类似的问题Running spec after promise has been resolved,其中一条评论指出了这个问题https://github.com/jasmine/jasmine/issues/412,其中说明Jasmine不支持此问题。有人想出任何解决方法吗?

describe('Car test', function () { var cars = ['audi', 'bmw']; cars.forEach(function (car) { it('car ' + car, function () { expect(car).toBe(car); }); }); });

失败
{{1}}

这很好用

{{1}}

3 个答案:

答案 0 :(得分:1)

将其作为答案发布,因为我无法在评论中正确地看待事情。

我实际上也在我的规范中生成测试,我正在使用https://www.npmjs.com/package/jasmine-data-provider,我认为你可能无法直接从已解决的承诺中生成它?并且包装在另一个中它对你不起作用。无论如何,这应该有效:

var using = require('jasmine-data-provider');
using(cars.forEach, function (car) {
        it(car + ' should be' + car, function () {
            expect(car).toBe(car);
        });
});

答案 1 :(得分:1)

这不是茉莉花的问题,这是您的代码的问题。 beforeAll不会阻止语句下面的后续代码。它会阻止在其中定义的代码('should ...',(done)=> {...});

it('should have cars', (done)=>{  
    cars.forEach(function (car) {
        expect(car).toBe(car);
    });
}

答案 2 :(得分:0)

由于Jasmine不支持在运行时添加测试,因此窍门是在启动Jasmine之前请求异步数据,然后在运行时使用检索到的数据。这可以通过单例和programmatically启动茉莉花来实现。

See here for a working example.

// car-collection.js
class CarCollection {

  static load() {
    return this.request()
      then((data) => this.cars = data);
  }

  static request() {
    // in practice this function would do something cooler
    return Promise.resolve(['audi', 'bmw']); 
  }
}

modules.export = CarCollection;

由于CarCollection具有static的方法,因此它们将在导入之间共享,并且this.cars将保持不变。

// launcher.js
const Jasmine = require('jasmine');
const CarCollection = require('./car-collection');

CarCollection.load()
  .then(() => {
    console.log(`car count is ${CarCollection.cars.length}`); // prints: car count is 2
    const jasmine = new Jasmine();
    jasmine.loadConfigFile(...); // path to jasmine.json
    jasmine.execute();
  });

这里的一个重要步骤是配置茉莉花,以了解在哪里查找测试文件。通过loading a configpassing specifics进入execute函数。

// car.spec.js
const CarCollection = require('./car-collection');

describe('test', function () {

  CarCollection.cars.forEach((car) => {

    it('test' + car, () => {
      expect(car).toBe(car);
    });
  });
});  

现在运行node ./launcher.js,测试应该运行。