Freigeben über


Testhilfsprogramme für Power BI-Visuals

Dieser Artikel unterstützt Sie bei der Installation, dem Import und der Verwendung der Testhilfsprogramme für Power BI-Visuals. Diese Testhilfsprogramme können für Komponententests verwendet werden. Zu den Programmen gehören Mocks und Methoden für Elemente wie Datenansichten, Auswahl und Farbschemas.

Voraussetzungen

Um dieses Paket zu verwenden, installieren Sie Folgendes:

Installation

Führen Sie den folgenden Befehl in Ihrem Verzeichnis mit Power BI-Visuals aus, um Testhilfsprogramme zu installieren und die dazugehörige Abhängigkeit Ihrer Datei package.json hinzuzufügen:

npm install powerbi-visuals-utils-testutils --save

Im Folgenden erhalten Sie Beschreibungen und Beispiele für die öffentliche API der Testhilfsprogramme.

VisualBuilderBase

Wird von VisualBuilder bei Komponententests mit den am häufigsten verwendeten Methoden build, update und updateRenderTimeout verwendet.

Die build-Methode gibt eine erstellte Instanz des Visuals zurück.

Die enumerateObjectInstances- und updateEnumerateObjectInstancesRenderTimeout-Methoden sind erforderlich, um Änderungen am Bucket und den Formatierungsoptionen zu überprüfen.

abstract class VisualBuilderBase<T extends IVisual> {
    element: JQuery;
    viewport: IViewport;
    visualHost: IVisualHost;
    protected visual: T;
    constructor(width?: number, height?: number, guid?: string, element?: JQuery);
    protected abstract build(options: VisualConstructorOptions): T;
     nit(): void;
    destroy(): void;
    update(dataView: DataView[] | DataView): void;
    updateRenderTimeout(dataViews: DataView[] | DataView, fn: Function, timeout?: number): number;
    updateEnumerateObjectInstancesRenderTimeout(dataViews: DataView[] | DataView, options: EnumerateVisualObjectInstancesOptions, fn: (enumeration: VisualObjectInstance[]) => void, timeout?: number): number;
    updateFlushAllD3Transitions(dataViews: DataView[] | DataView): void;
    updateflushAllD3TransitionsRenderTimeout(dataViews: DataView[] | DataView, fn: Function, timeout?: number): number;
    enumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstance[];
}

DataViewBuilder

Wird von TestDataViewBuilder verwendet. Dieses Modul stellt eine in der createCategoricalDataViewBuilder-Methode verwendete CategoricalDataViewBuilder-Klasse bereit. Dort werden auch Schnittstellen und Methoden angegeben, die erforderlich sind, um mit simulierten DataView-Klassen in Komponententests arbeiten zu können.

  • withValues fügt statische Datenreihenspalten hinzu, und withGroupedValues fügt dynamische Datenreihenspalten hinzu.

    Wenden Sie nicht dynamische Datenreihen und statische Datenreihen in DataViewCategorical eines Visuals an. Sie können beide nur in der DataViewCategorical-Abfrage verwenden, wobei erwartet wird, dass DataViewTransform sie in separate visuelle DataViewCategorical-Objekte aufteilt.

  • build gibt das DataView-Objekt mit Metadaten sowie DataViewCategorical zurück.

    build gibt Nicht definiert zurück, wenn die Kombination der Parameter nicht zulässig ist, z. B. wenn sowohl dynamische als auch statische Datenreihen bei der Erstellung der DataView-Klasse des Visuals eingeschlossen werden.

class CategoricalDataViewBuilder implements IDataViewBuilderCategorical {
    withCategory(options: DataViewBuilderCategoryColumnOptions): IDataViewBuilderCategorical;
    withCategories(categories: DataViewCategoryColumn[]): IDataViewBuilderCategorical;
    withValues(options: DataViewBuilderValuesOptions): IDataViewBuilderCategorical;
    withGroupedValues(options: DataViewBuilderGroupedValuesOptions): IDataViewBuilderCategorical;
    build(): DataView;
}

function createCategoricalDataViewBuilder(): IDataViewBuilderCategorical;

TestDataViewBuilder

Wird für die Erstellung von VisualData bei Komponententests verwendet. Wenn Daten in Datenfeldbuckets platziert werden, generiert Power BI ein kategorisches DataView-Objekt basierend auf den Daten. TestDataViewBuilder unterstützt die Simulierung der Erstellung des kategorischen DataView-Objekts.

abstract class TestDataViewBuilder {
    static DataViewName: string;
    private aggregateFunction;
    static setDefaultQueryName(source: DataViewMetadataColumn): DataViewMetadataColumn;
    static getDataViewBuilderColumnIdentitySources(options: TestDataViewBuilderColumnOptions[] | TestDataViewBuilderColumnOptions): DataViewBuilderColumnIdentitySource[];
    static getValuesTable(categories?: DataViewCategoryColumn[], values?: DataViewValueColumn[]): any[][];
    static createDataViewBuilderColumnOptions(categoriesColumns: (TestDataViewBuilderCategoryColumnOptions | TestDataViewBuilderCategoryColumnOptions[])[], valuesColumns: (DataViewBuilderValuesColumnOptions | DataViewBuilderValuesColumnOptions[])[], filter?: (options: TestDataViewBuilderColumnOptions) => boolean, customizeColumns?: CustomizeColumnFn): DataViewBuilderAllColumnOptions;
    static setUpDataViewBuilderColumnOptions(options: DataViewBuilderAllColumnOptions, aggregateFunction: (array: number[]) => number): DataViewBuilderAllColumnOptions;
    static setUpDataView(dataView: DataView, options: DataViewBuilderAllColumnOptions): DataView;
    protected createCategoricalDataViewBuilder(categoriesColumns: (TestDataViewBuilderCategoryColumnOptions | TestDataViewBuilderCategoryColumnOptions[])[], valuesColumns: (DataViewBuilderValuesColumnOptions | DataViewBuilderValuesColumnOptions[])[], columnNames: string[], customizeColumns?: CustomizeColumnFn): IDataViewBuilderCategorical;
    abstract getDataView(columnNames?: string[]): DataView;
}

Im Folgenden finden Sie die am häufigsten verwendeten Schnittstellen bei der Erstellung von testDataView:

interface TestDataViewBuilderColumnOptions extends DataViewBuilderColumnOptions {
    values: any[];
}

interface TestDataViewBuilderCategoryColumnOptions extends TestDataViewBuilderColumnOptions {
    objects?: DataViewObjects[];
    isGroup?: boolean;
}

interface DataViewBuilderColumnOptions {
    source: DataViewMetadataColumn;
}

interface DataViewBuilderSeriesData {
    values: PrimitiveValue[];
    highlights?: PrimitiveValue[];
    /** Client-computed maximum value for a column. */
    maxLocal?: any;
    /** Client-computed maximum value for a column. */
    minLocal?: any;
}

interface DataViewBuilderColumnIdentitySource {
    fields: any[];
    identities?: CustomVisualOpaqueIdentity[];
}

Mocks

MockIVisualHost

Implementiert IVisualHost, um Power BI-Visuals ohne externe Abhängigkeiten wie dem Power BI-Framework zu testen.

Zu den geeigneten Methoden gehören createSelectionIdBuilder, createSelectionManager und createLocalizationManager sowie Getter für Eigenschaften.

import powerbi from "powerbi-visuals-api";

import VisualObjectInstancesToPersist = powerbi.VisualObjectInstancesToPersist;
import ISelectionIdBuilder = powerbi.visuals.ISelectionIdBuilder;
import ISelectionManager = powerbi.extensibility.ISelectionManager;
import IColorPalette = powerbi.extensibility.IColorPalette;
import IVisualEventService = powerbi.extensibility.IVisualEventService;
import ITooltipService = powerbi.extensibility.ITooltipService;
import IVisualHost = powerbi.extensibility.visual.IVisualHost;

class MockIVisualHost implements IVisualHost {
      constructor(
          colorPalette?: IColorPalette,
          selectionManager?: ISelectionManager,
          tooltipServiceInstance?: ITooltipService,
          localeInstance?: MockILocale,
          allowInteractionsInstance?: MockIAllowInteractions,
          localizationManager?: powerbi.extensibility.ILocalizationManager,
          telemetryService?: powerbi.extensibility.ITelemetryService,
          authService?: powerbi.extensibility.IAuthenticationService,
          storageService?: ILocalVisualStorageService,
          eventService?: IVisualEventService);
      createSelectionIdBuilder(): ISelectionIdBuilder;
      createSelectionManager(): ISelectionManager;
      createLocalizationManager(): ILocalizationManager;
      colorPalette: IColorPalette;
      locale: string;
      telemetry: ITelemetryService;
      tooltipService: ITooltipService;
      allowInteractios: boolean;
      storageService: ILocalVisualStorageService;
      eventService: IVisualEventService;
      persistProperties(changes: VisualObjectInstancesToPersist): void;
}
  • createVisualHost erstellt eine Instanz von IVisualHost und gibt sie zurück, genau genommen MockIVisualHost.

    function createVisualHost(locale?: Object, allowInteractions?: boolean, colors?: IColorInfo[], isEnabled?: boolean, displayNames?: any, token?: string): IVisualHost;
    

    Beispiel:

    import { createVisualHost } from "powerbi-visuals-utils-testutils"
    
    let host: IVisualHost = createVisualHost();
    

Wichtig

Bei MockIVisualHost handelt es sich um eine Fakeimplementierung von IVisualHost. MockIVisualHost sollte nur mit Komponententests verwendet werden.

MockIColorPalette

Implementiert IColorPalette, um Power BI-Visuals ohne externe Abhängigkeiten wie dem Power BI-Framework zu testen.

MockIColorPalette stellt hilfreiche Eigenschaften für die Überprüfung des Farbschemas oder des Modus mit hohem Kontrast bei Komponententests bereit.

import powerbi from "powerbi-visuals-api";
import IColorPalette = powerbi.extensibility.ISandboxExtendedColorPalette;
import IColorInfo = powerbi.IColorInfo;

class MockIColorPalette implements IColorPalette {
    constructor(colors?: IColorInfo[]);
    getColor(key: string): IColorInfo;
    reset(): IColorPalette;
    isHighContrastMode: boolean;
    foreground: {value: string};
    foregroundLight: {value: string};
    ...
    background: {value: string};
    backgroundLight: {value: string};
    ...
    shapeStroke: {value: string};
}
  • createColorPalette erstellt eine Instanz von IColorPalette und gibt sie zurück, genau genommen MockIColorPalette.

    function createColorPalette(colors?: IColorInfo[]): IColorPalette;
    

    Beispiel:

    import { createColorPalette } from "powerbi-visuals-utils-testutils"
    
    let colorPalette: IColorPalette = createColorPalette();
    

Wichtig

Bei MockIColorPalette handelt es sich um eine Fakeimplementierung von IColorPalette. MockIColorPalette sollte nur mit Komponententests verwendet werden.

MockISelectionId

Implementiert ISelectionId, um Power BI-Visuals ohne externe Abhängigkeiten wie dem Power BI-Framework zu testen.

import powerbi from "powerbi-visuals-api";
import Selector = powerbi.data.Selector;
import ISelectionId = powerbi.visuals.ISelectionId;

class MockISelectionId implements ISelectionId {
    constructor(key: string);
    equals(other: ISelectionId): boolean;
    includes(other: ISelectionId, ignoreHighlight?: boolean): boolean;
    getKey(): string;
    getSelector(): Selector;
    getSelectorsByColumn(): Selector;
    hasIdentity(): boolean;
}
  • createSelectionId erstellt eine Instanz von ISelectionId und gibt sie zurück, genau genommen MockISelectionId.

    function createSelectionId(key?: string): ISelectionId;
    

    Beispiel:

    import { createColorPalette } from "powerbi-visuals-utils-testutils"
    
    let selectionId: ISelectionId = createSelectionId();
    

Hinweis

Bei MockISelectionId handelt es sich um eine Fakeimplementierung von ISelectionId. MockISelectionId sollte nur mit Komponententests verwendet werden.

MockISelectionIdBuilder

Implementiert ISelectionIdBuilder, um Power BI-Visuals ohne externe Abhängigkeiten wie dem Power BI-Framework zu testen.

import DataViewCategoryColumn = powerbi.DataViewCategoryColumn;
import DataViewValueColumn = powerbi.DataViewValueColumn;
import DataViewValueColumnGroup = powerbi.DataViewValueColumnGroup;
import DataViewValueColumns = powerbi.DataViewValueColumns;
import ISelectionIdBuilder = powerbi.visuals.ISelectionIdBuilder;
import ISelectionId = powerbi.visuals.ISelectionId;

class MockISelectionIdBuilder implements ISelectionIdBuilder {
    withCategory(categoryColumn: DataViewCategoryColumn, index: number): this;
    withSeries(seriesColumn: DataViewValueColumns, valueColumn: DataViewValueColumn | DataViewValueColumnGroup): this;
    withMeasure(measureId: string): this;
    createSelectionId(): ISelectionId;
    withMatrixNode(matrixNode: DataViewMatrixNode, levels: DataViewHierarchyLevel[]): this;
    withTable(table: DataViewTable, rowIndex: number): this;
}
  • createSelectionIdBuilder erstellt eine Instanz von ISelectionIdBuilder und gibt sie zurück, genau genommen MockISelectionIdBuilder.

    function createSelectionIdBuilder(): ISelectionIdBuilder;
    

    Beispiel:

    import { selectionIdBuilder } from "powerbi-visuals-utils-testutils";
    
    let selectionIdBuilder = createSelectionIdBuilder();
    

Hinweis

Bei MockISelectionIdBuilder handelt es sich um eine Fakeimplementierung von ISelectionIdBuilder. MockISelectionIdBuilder sollte nur mit Komponententests verwendet werden.

MockISelectionManager

Implementiert ISelectionManager, um Power BI-Visuals ohne externe Abhängigkeiten wie dem Power BI-Framework zu testen.

import powerbi from "powerbi-visuals-api";
import IPromise = powerbi.IPromise;
import ISelectionId = powerbi.visuals.ISelectionId;
import ISelectionManager = powerbi.extensibility.ISelectionManager;

class MockISelectionManager implements ISelectionManager {
    select(selectionId: ISelectionId | ISelectionId[], multiSelect?: boolean): IPromise<ISelectionId[]>;
    hasSelection(): boolean;
    clear(): IPromise<{}>;
    getSelectionIds(): ISelectionId[];
    containsSelection(id: ISelectionId): boolean;
    showContextMenu(selectionId: ISelectionId, position: IPoint): IPromise<{}>;
    registerOnSelectCallback(callback: (ids: ISelectionId[]) => void): void;
    simutateSelection(selections: ISelectionId[]): void;
}
  • createSelectionManager erstellt eine Instanz von ISelectionManager und gibt sie zurück, genau genommen MockISelectionManager.

    function createSelectionManager(): ISelectionManager
    

    Beispiel:

    import { createSelectionManager } from "powerbi-visuals-utils-testutils";
    
    let selectionManager: ISelectionManager = createSelectionManager();
    

Hinweis

Bei MockISelectionManager handelt es sich um eine Fakeimplementierung von ISelectionManager. MockISelectionManager sollte nur mit Komponententests verwendet werden.

MockILocale

Legt das Gebietsschema fest und ändert es entsprechend Ihrer Anforderungen während des Komponententestprozesses.

class MockILocale {
    constructor(locales?: Object): void; // Default locales are en-US and ru-RU 
    locale(key: string): void;// setter property
    locale(): string; // getter property
}
  • createLocale erstellt eine Instanz von MockILocale und gibt sie zurück.
    funciton createLocale(locales?: Object): MockILocale;
    

MockITooltipService

Simuliert TooltipService und führt entsprechend Ihrer Anforderungen während des Komponententestprozesses einen Aufruf dafür aus.

class MockITooltipService implements ITooltipService {
    constructor(isEnabled: boolean = true);
    enabled(): boolean;
    show(options: TooltipShowOptions): void;
    move(options: TooltipMoveOptions): void;
    hide(options: TooltipHideOptions): void;
}
  • createTooltipService erstellt eine Instanz von MockITooltipService und gibt sie zurück.
    function createTooltipService(isEnabled?: boolean): ITooltipService;
    

MockIAllowInteractions

export class MockIAllowInteractions {
    constructor(public isEnabled?: boolean); // false by default
}
  • createAllowInteractions erstellt eine Instanz von MockIAllowInteractions und gibt sie zurück.
    function createAllowInteractions(isEnabled?: boolean): MockIAllowInteractions;
    

MockILocalizationManager

Stellt grundlegende Funktionen von LocalizationManager bereit, die für Komponententests erforderlich sind.

class MockILocalizationManager implements ILocalizationManager {
    constructor(displayNames: {[key: string]: string});
    getDisplayName(key: string): string; // returns default or setted displayNames for localized elements
}
  • createLocalizationManager erstellt eine Instanz von ILocalizationManager und gibt sie zurück, genau genommen MockILocalizationManager.

    function createLocalizationManager(displayNames?: any): ILocalizationManager;
    

    Beispiel:

    import { createLocalizationManager } from "powerbi-visuals-utils-testutils";
    let localizationManagerMock: ILocalizationManager = createLocalizationManager();
    

MockITelemetryService

Simuliert die Verwendung von TelemetryService.

class MockITelemetryService implements ITelemetryService {
    instanceId: string;
    trace(veType: powerbi.VisualEventType, payload?: string) {
    }
}

Erstellung von MockITelemetryServicetypescript function createTelemetryService(): ITelemetryService;

MockIAuthenticationService

Simuliert die Arbeit von AuthenticationService, indem ein simuliertes Microsoft Entra-Token bereitgestellt wird.

class MockIAuthenticationService implements IAuthenticationService  {
    constructor(token: string);
    getAADToken(visualId?: string): powerbi.IPromise<string>
}
  • createAuthenticationService erstellt eine Instanz von IAuthenticationService und gibt sie zurück, genau genommen MockIAuthenticationService.
    function createAuthenticationService(token?: string): IAuthenticationService;
    

MockIStorageService

Ermöglicht Ihnen die Verwendung von ILocalVisualStorageService mit demselben Verhalten wie LocalStorage.

class MockIStorageService implements ILocalVisualStorageService {
  get(key: string): IPromise<string>;
  set(key: string, data: string): IPromise<number>;
  remove(key: string): void;
}
  • createStorageService erstellt eine Instanz von ILocalVisualStorageService und gibt sie zurück, genau genommen MockIStorageService.
    function createStorageService(): ILocalVisualStorageService;
    

MockIEventService

import powerbi from "powerbi-visuals-api";
import IVisualEventService = powerbi.extensibility.IVisualEventService;
import VisualUpdateOptions = powerbi.extensibility.VisualUpdateOptions;

class MockIEventService implements IVisualEventService {
      renderingStarted(options: VisualUpdateOptions): void;
      renderingFinished(options: VisualUpdateOptions): void;
      renderingFailed(options: VisualUpdateOptions, reason?: string): void;
}
  • createEventService erstellt eine Instanz von IVisualEventService und gibt sie zurück, genau genommen MockIEventService.
    function createEventService(): IVisualEventService;
    

Hilfsprogramme

Zu Hilfsprogrammen gehören Hilfsmethoden für Komponententests von Power BI-Visuals, einschließlich Hilfsprogrammen zu Farben, Zahlen und Ereignissen.

  • renderTimeout gibt ein Timeout zurück.

    function renderTimeout(fn: Function, timeout: number = DefaultWaitForRender): number
    
  • testDom unterstützt das Festlegen einer Fixierung bei Komponententests.

    function testDom(height: number | string, width: number | string): JQuery
    

    Beispiel:

    import { testDom }  from "powerbi-visuals-utils-testutils";
    describe("testDom", () => {
        it("should return an element", () => {
            let element: JQuery = testDom(500, 500);
            expect(element.get(0)).toBeDefined();
        });
    });
    
  • getSolidColorStructuralObject

    function getSolidColorStructuralObject(color: string): any
    

    Gibt die folgende Struktur zurück:

    { solid: { color: color } }
    
  • assertColorsMatch vergleicht RgbColor-Objekte, die aus Eingabezeichenfolgen geparst wurden.

    function assertColorsMatch(actual: string, expected: string, invert: boolean = false): boolean
    
  • parseColorString parst Farben aus Eingabezeichenfolgen und gibt sie über die angegebene Schnittstelle RgbColor zurück.

    function parseColorString(color: string): RgbColor
    
  • getRandomNumbersgeneriert eine zufällige Zahl mithilfe von Minimal- und Maximalwerten. Sie können exceptionList angeben und eine Funktion bereitstellen, damit sich das Ergebnis ändert.

    function getRandomNumber(
        min: number,
        max: number,
        exceptionList?: number[],
        changeResult: (value: any) => number = x => x): number
    
  • getRandomNumbers stellt ein Array zufälliger Zahlen bereit, die von der getRandomNumber-Methode mit den angegebenen Minimal- und Maximalwerten generiert werden.

    function getRandomNumbers(count: number, min: number = 0, max: number = 1): number[]
    

Die folgenden Methoden werden für die Simulation von Webseitenereignissen bei Komponententests geschrieben.

  • clickElement simuliert einen Klick auf das angegebene Element.

    function clickElement(element: JQuery, ctrlKey: boolean = false): void
    
  • createTouch gibt ein Touch-Objekt zurück, um die Simulation eines Fingereingabeereignisses zu unterstützen.

    function createTouch(x: number, y: number, element: JQuery, id: number = 0): Touch
    
  • createTouchesList gibt eine Liste simulierter Touch-Ereignisse zurück.

    function createTouchesList(touches: Touch[]): TouchList
    
  • createContextMenuEvent gibt MouseEvent zurück.

    function createContextMenuEvent(x: number, y: number): MouseEvent
    
  • createMouseEvent erstellt MouseEvent und gibt es zurück.

    function createMouseEvent(
        mouseEventType: MouseEventType,
        eventType: ClickEventType,
        x: number,
        y: number,
        button: number = 0): MouseEvent
    
  • createTouchEndEvent

    function createTouchEndEvent(touchList?: TouchList): UIEvent
    
  • createTouchMoveEvent

    function createTouchMoveEvent(touchList?: TouchList): UIEvent
    
  • createTouchStartEvent

    function createTouchStartEvent(touchList?: TouchList): UIEvent
    

Die folgenden Methoden werden verwendet, um D3-Ereignisse bei Komponententests zu simulieren.

  • flushAllD3Transitions erzwingt, dass alle D3-Übergänge abgeschlossen werden.

    function flushAllD3Transitions()
    

    Hinweis

    Normalerweise werden verzögerungsfreie Übergänge nach einer sofortigen Verzögerung (<10 ms) ausgeführt, dies kann jedoch zu einem kurzen Flackern führen, wenn der Browser die Seite zweimal rendert. Einmal am Ende der ersten Ereignisschleife, ein zweites Mal sofort beim ersten Timerrückruf.

    Dieses Flackern fällt im Internet Explorer sowie bei vielen Webansichten stärker auf, weshalb es für iOS vermieden werden sollte.

    Indem die Timerwarteschlange am Ende der ersten Ereignisschleife geleert wird, können Sie Übergänge ohne Verzögerung sofort ausführen und das Flackern so verhindern.

Die folgenden Methoden sind hier ebenfalls relevant:

function d3Click(element: JQuery, x: number, y: number, eventType?: ClickEventType, button?: number): void
function d3MouseUp(element: JQuery, x: number, y: number, eventType?: ClickEventType, button?: number): void
function d3MouseDown(element: JQuery, x: number, y: number, eventType?: ClickEventType, button?: number): void
function d3MouseOver(element: JQuery, x: number, y: number, eventType?: ClickEventType, button?: number): void
function d3MouseMove(element: JQuery, x: number, y: number, eventType?: ClickEventType, button?: number): void
function d3MouseOut(element: JQuery, x: number, y: number, eventType?: ClickEventType, button?: number): void
function d3KeyEvent(element: JQuery, typeArg: string, keyArg: string, keyCode: number): void
function d3TouchStart(element: JQuery, touchList?: TouchList): void
function d3TouchMove(element: JQuery, touchList?: TouchList): void
function d3TouchEnd(element: JQuery, touchList?: TouchList): void
function d3ContextMenu(element: JQuery, x: number, y: number): void

Hilfsschnittstellen

Die folgende Schnittstelle und die folgenden Enumerationen werden in der Hilfsfunktion verwendet.

interface RgbColor {
    R: number;
    G: number;
    B: number;
    A?: number; 
}

enum ClickEventType {
    Default = 0,
    CtrlKey = 1,
    AltKey = 2,
    ShiftKey = 4,
    MetaKey = 8,
}

enum MouseEventType {
    click,
    mousedown,
    mouseup,
    mouseover,
    mousemove,
    mouseout,
}

Informationen zum Schreiben von Komponententests für Webpack-basierte Power BI-Visuals und Unit-Tests mit karma und jasmine finden Sie unter Tutorial: Hinzufügen von Komponententests für visuelle Power BI-Projekte.