错误:请在测试前调用"TestBed.compileComponents"

Com*_*ode 11 jasmine karma-jasmine webpack angular2-template angular

我收到这个错误:

错误:此测试模块使用正在使用"templateUrl"的组件MessagesComponent,但它们从未编译过.请在测试前调用"TestBed.compileComponents".

当试图运行这个简单的测试Angular 2&Jasmine Test:

  let comp:    MessagesComponent;
let fixture: ComponentFixture<MessagesComponent>;

describe('MessagesComponent', () => {
    beforeEach(() => {


        TestBed.configureTestingModule({
            declarations: [ MessagesComponent ],
            providers:    [ {provide: DataService, useValue: {} } ]

        })
            .compileComponents(); // compile template and css

        fixture = TestBed.createComponent(MessagesComponent);
        comp = fixture.componentInstance;

    });

    it('example', () => {
        expect("true").toEqual("true");
    });
});
Run Code Online (Sandbox Code Playgroud)

我想这可能是由于我的webpack测试配置的原因:

'use strict';

const path = require('path');
const webpack = require('webpack');

module.exports = {
    devtool: 'inline-source-map',
    module: {
        loaders: [
            { loader: 'raw', test: /\.(css|html)$/ },
            { exclude: /node_modules/, loader: 'ts', test: /\.ts$/ }
        ]
    },
    resolve: {
        extensions: ['', '.js', '.ts'],
        modulesDirectories: ['node_modules'],
        root: path.resolve('.', 'src')
    },
    tslint: {
        emitErrors: true
    }
};
Run Code Online (Sandbox Code Playgroud)

pe8*_*ter 27

当您的模板未内联到组件中时,模板提取是异步的,因此您需要告诉Jasmine.更改

beforeEach(() => {
    TestBed.configureTestingModule({ ... })
        .compileComponents();
    fixture = TestBed.createComponent(MessagesComponent);
    comp = fixture.componentInstance;
});
Run Code Online (Sandbox Code Playgroud)

beforeEach(async(() => {
    TestBed.configureTestingModule({ ... })
        .compileComponents()
        .then(() => {
            fixture = TestBed.createComponent(MessagesComponent);
            comp = fixture.componentInstance;
        });
}));
Run Code Online (Sandbox Code Playgroud)

  • 请发布代码完成它应该是什么我真的不明白 (2认同)

LeO*_* Li 5

由于您已经在使用webpack,理论上您不必compileComponents()根据此处的官方文档调用该函数,因为webpack内联模板和 css 作为运行测试之前的自动构建过程的一部分。

您的模板/CSS 未内联的一个可能原因是 IDE( VisualStudio/WebStorm/IntelliJ) 自动将您的 ts 编译为 js,并且以文件为目标的 webpack 加载器js/ts试图应用于已编译的 js文件而不是源 ts 文件。