web-dev-qa-db-de.com

Fehler: Bitte rufen Sie vor Ihrem Test "TestBed.compileComponents" an

Ich erhalte diesen Fehler:

Fehler: Dieses Testmodul verwendet die Komponente MessagesComponent, die eine "templateUrl" verwendet, die jedoch nie kompiliert wurde. Bitte rufen Sie vor Ihrem Test "TestBed.compileComponents" an.

Wenn Sie versuchen, diesen einfachen Test auszuführen, Angular 2 & Jasmin 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");
    });
});

Ich denke, das könnte an meiner Konfiguration für den Webpack-Test liegen:

'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
    }
};
11
CommonSenseCode

Das Abrufen von Vorlagen erfolgt asynchron, wenn Ihre Vorlagen nicht in Ihre Komponenten eingebettet sind. Sie müssen Jasmine das mitteilen. Veränderung

beforeEach(() => {
    TestBed.configureTestingModule({ ... })
        .compileComponents();
    fixture = TestBed.createComponent(MessagesComponent);
    comp = fixture.componentInstance;
});

zu

beforeEach(async(() => {
    TestBed.configureTestingModule({ ... })
        .compileComponents()
        .then(() => {
            fixture = TestBed.createComponent(MessagesComponent);
            comp = fixture.componentInstance;
        });
}));
21
pe8ter

Da Sie webpack bereits verwenden, sollten Sie die Funktion compileComponents() theoretisch nicht gemäß dem offiziellen doc here aufrufen müssen, da webpack Vorlagen und css als Teil des automatisierten Build-Prozesses einleitet, der dem Test vorangeht.

Ein möglicher Grund dafür, dass Ihre Vorlage/css nicht inline ist, ist, dass die IDE (VisualStudio/WebStorm/IntelliJ) Ihre TS automatisch zu js kompiliert und die Webpack-Ladeprogramme, die Ziel für js/ts-Dateien sind, stattdessen auf die bereits kompilierten js -Dateien angewendet werden der Quell-TS-Dateien. 

0
Leon li