我使用Aurelia和Webpack。基于ESNext Skeleton Webpack.
https://github.com/aurelia/skeleton-navigation/tree/master/skeleton-esnext-webpack我有一些普通的JS模型类,如:
import {ValidationRules} from 'aurelia-validation';
export class Address {
street = '';
}
ValidationRules
.ensure('street').required()
.on(Address);
一旦我运行我的Jasmine测试(通过Karma)和Wallaby,我得到错误:
'Message: Did you forget to add ".plugin('aurelia-validation)" to your main.js?'
OK -我没有main.js运行测试时,所以如何加载插件?
我试过这样做——使用aurelia-testing:
import {StageComponent} from 'aurelia-testing';
import {bootstrap} from 'aurelia-bootstrapper-webpack';
...
let component;
beforeEach(done => {
component = StageComponent
.withResources();
component.bootstrap(aurelia => {
aurelia.use.plugin('aurelia-validation')
});
done();
});
但这在Webpack中不起作用- open issue with aurelia-bootstrapper-webpack。也许我做错了。
是否有其他方法在测试期间加载验证插件?或者使用webpack进行aurelia测试?
目前,如果我有验证插件,或者尝试使用aurelia-testing,我完全无法进行任何单元测试。
我使用aurelia-cli和wallaby使其工作。你很接近了,我想这更让人沮丧。对我来说,秘密是验证插件必须首先使用规范文件中的beforeAll方法启动,然后在beforeEach方法中创建被测系统。下面的规范文件为我工作,并解决了消息:你忘记添加".plugin('aurelia-validation')到你的main.js"错误。
import { SourceSystemEntity } from '../../../src/entities/sourceSystemEntity';
import { StageComponent } from 'aurelia-testing';
import { bootstrap } from 'aurelia-bootstrapper';
describe('SourceSystem class', () => {
let component;
let sut: SourceSystemEntity;
beforeAll(done => {
component = StageComponent.withResources().inView('<div></div>').boundTo({});
component.configure = (aurelia: Aurelia) => {
aurelia.use
.standardConfiguration()
.plugin('aurelia-validation');
};
component.create(bootstrap).then(() => {
done();
});
});
afterAll(() => {
component.dispose();
});
beforeEach(() => {
sut = new SourceSystemEntity();
});
it('has Validation enabled', () => {
expect(sut.hasValidation()).toBeTruthy();
});
});
我发现ValidationRules是在导入过程中运行的。因为他们还没有被放到实际的课堂上。对我来说有效的是将ValidationRules放入构造函数或另一个方法中,并在引导运行后调用它们。仍然没有修复测试期间的验证功能,但它确实允许您运行单元测试
import {ValidationRules} from 'aurelia-validation';
export class Address {
street = '';
constructor() {
ValidationRules
.ensure('street').required()
.on(Address);
}
}