以下是同一测试的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}}
答案 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 config或passing 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
,测试应该运行。