标签: angular-test

角度5测试静态方法的组件

我在我测试的Component类上有一个静态方法,我的问题是如何在我的spec测试文件中访问该方法?

到目前为止,我可以访问一个组件实例:

  let fixture = TestBed.createComponent(MyComponent);
  let comp = fixture.componentInstance;
Run Code Online (Sandbox Code Playgroud)

jasmine angular angular-test

2
推荐指数
1
解决办法
2558
查看次数

Angular cli ChromeHeadless karma 仍然打开浏览器

我想使用带有业力的 ChromeHeadless。我的配置是:

process.env.CHROME_BIN = require('puppeteer').executablePath();

module.exports = function( config ) {
  config.set({
    basePath                : '',
    frameworks              : ['jasmine', '@angular/cli'],
    plugins                 : [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('@angular/cli/plugins/karma')
    ],
    angularCli              : {
      environment: 'dev'
    },
    reporters               : ['progress'],
    autoWatch               : false,
    browsers: [
      'ChromeHeadless',
    ],
    singleRun               : true
  });
};
Run Code Online (Sandbox Code Playgroud)

当我运行 ng test 时,我仍然需要打开浏览器。这是我从业力控制台得到的信息:

Karma v2.0.0 服务器启动于http://0.0.0.0:9876/

karma-runner angular angular-test

2
推荐指数
1
解决办法
1969
查看次数

如何使用 Jasmine 对 Promise catch 进行单元测试

我有一个非常简单的函数 load(),我正在尝试使用 Jasmine 对其进行单元测试。this.service.loadObject() 返回一个 Promise。

如果 Promise 被拒绝,我如何测试 this.logService.error 是否会被调用?

load() {
    this.service.loadObject().then(x => {
       this.variable = x;
    }).catch(ex => this.logService.error(ex));
}
Run Code Online (Sandbox Code Playgroud)

unit-testing promise jasmine angular angular-test

2
推荐指数
1
解决办法
9213
查看次数

Angular 组件测试 - 按组件查询

当测试 a 的 DOM 表示时@Component,您可以通过其固定装置查询其嵌套元素

fixture.debugElement.queryAll(By.css('.example'));
Run Code Online (Sandbox Code Playgroud)

您还可以按以下条件过滤@Directive

fixture.debugElement.queryAll(By.directive(RouterLinkDirectiveStub));
Run Code Online (Sandbox Code Playgroud)

现在,假设你有一个@Component NzButtonComponent像这样使用的内部

<button nz-button>Example</button>
Run Code Online (Sandbox Code Playgroud)

怎样才能精确查询到呢?没有By.component(...)

angular angular-test

2
推荐指数
1
解决办法
4576
查看次数

带有模拟结构指令的 Angular 测试组件失败

我正在尝试在组件测试中模拟结构指令,但出现错误。

以下测试失败并显示一条消息:

嵌入模板上的任何指令都未使用属性绑定 appSome。确保属性名称拼写正确,并且所有指令都列在“@NgModule.declarations”中。("[错误 ->] 测试

我嘲笑结构指令SomeDirectiveSomeMockDirectiveapp.component.spec.ts中定义。测试失败

如果我切换声明使其包含SomeDirective-测试通过

我想知道为什么我不能让它与模拟版本一起工作。

模板:

<h1 *appSome="true">TEST</h1>
Run Code Online (Sandbox Code Playgroud)

指令(生产种类:)):

@Directive({
  selector: '[appSome]'
})
export class SomeDirective implements OnDestroy {
  show: boolean;
  ...
}


Run Code Online (Sandbox Code Playgroud)

测试:

import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { Directive, NO_ERRORS_SCHEMA } from '@angular/core';

@Directive({
  selector: '[appSome]'
})
export class SomeMockDirective {}

describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [AppComponent, SomeMockDirective], // test is …
Run Code Online (Sandbox Code Playgroud)

angular-directive angular angular-test

2
推荐指数
1
解决办法
1091
查看次数

Angular:测试 Http POST 方法

我有一个简单的服务方法,可以调用http post添加 todoList:

add(event: any): Observable<TodoList> {
    let todoListToAdd: TodoList = { name: event.target.value, listItems: []};
    return this.http.post<TodoList>("https://localhost:44305/todolist", todoListToAdd);
}
Run Code Online (Sandbox Code Playgroud)

我想对这个方法进行单元测试并尝试如下:

import { TestBed, getTestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

import { TodolistService } from './todolist.service';
import { TodoList } from './todolist';
import { HttpResponse } from '@angular/common/http';

describe('TodolistService', () => {
  let injector: TestBed;
  let service: TodolistService;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [ HttpClientTestingModule ],
      providers: [ TodolistService ] …
Run Code Online (Sandbox Code Playgroud)

unit-testing karma-jasmine angular angular-unit-test angular-test

2
推荐指数
1
解决办法
1815
查看次数

为什么我收到此错误:NullInjectorError:R3InjectorError(DynamicTestModule)[MedicoService?

我正在学习有关角度测试的课程,并且尝试为具有服务的组件设置测试,并且该服务具有 httpClias 作为依赖项,但当我尝试运行它时出现此错误

\n
NullInjectorError: R3InjectorError(DynamicTestModule)[MedicoService -> HttpClient -> HttpClient]:\n          NullInjectorError: No provider for HttpClient!\n        error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'MedicoService', 'HttpClient', 'HttpClient' ] })\n        NullInjectorError: R3InjectorError(DynamicTestModule)[MedicoService -> HttpClient -> HttpClient]:\n          NullInjectorError: No provider for HttpClient!\n            at NullInjector.get (node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:10756:1)\n            at R3Injector.get (node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:10923:1)\n            at R3Injector.get (node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:10923:1)\n            at injectInjectorOnly (node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:2290:1)\n            at \xc9\xb5\xc9\xb5inject (node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:2294:1)\n            at Object.MedicoService_Factory [as factory] (ng:///MedicoService/\xc9\xb5fac.js:5:41)\n            at R3Injector.hydrate (node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:11091:1)\n            at R3Injector.get (node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:10912:1)\n            at NgModuleRef$1.get (node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js:24988:1)\n            at TestBedRender3.inject (node_modules/@angular/core/__ivy_ngcc__/fesm2015/testing.js:1943:1)\n        Error: Expected undefined to be truthy.\n            at <Jasmine>\n            at UserContext.<anonymous> …
Run Code Online (Sandbox Code Playgroud)

testing karma-jasmine angular angular-test

2
推荐指数
1
解决办法
1万
查看次数

获取调用间谍的参数

我正在监视inemit的方法EventEmitterAngular

spyOn(answerComponent.answerEmitter, 'emit');
Run Code Online (Sandbox Code Playgroud)

我想检查是否emit带有参数调用A,但我不想检查与A. 我想检查是否emit使用值调用A.a, A.b并忽略 的值A.c

可以这样做吗?

jasmine angular-test angular6

2
推荐指数
1
解决办法
4448
查看次数

NgRX ProvideMockStore createSelector 状态未定义

当使用提供的模拟存储时,我的功能/选择器函数仅将状态视为未定义。

因此,我只能模拟选择器,因此无法执行更全面的集成测试。

当模拟商店提供状态时,选择器是否不应该看到状态,或者这应该起作用吗?

创建模拟商店

     TestBed.configureTestingModule({
        providers: [
            AuthGuardGuard,
            provideMockStore({
                initialState: { ...initialState },
            }),
        ],
    });
Run Code Online (Sandbox Code Playgroud)

然后记录选择器应该看到的状态,这是未定义的。

export const currentUser = createSelector(
    authRootFeature,
    (state: fromAuthRoot.State) => {
        console.log(state); // Undefined
        return state.auth.currentUser;
    }
);
Run Code Online (Sandbox Code Playgroud)

ngrx angular angular-test

2
推荐指数
1
解决办法
3443
查看次数

Angular Material 组件未通过测试

我有一个用 Angular 制作的 Sidenav 菜单。该组件如下所示:

模板:

 <mat-toolbar color="primary" [fxLayoutAlign]="(settings.menuType != 'mini') ? 'space-between center' : 'center center'" class="sidenav-header">
    <a mat-raised-button color="accent" routerLink="/" (click)="closeSubMenus()" class="small-logo">Menu</a>
    <a *ngIf="settings.menuType == 'default'" class="logo" routerLink="/" (click)="closeSubMenus()">mEMS</a> 
</mat-toolbar>

<div fxLayout="column" fxLayoutAlign="center center" class="user-block transition-2" [class.show]="settings.sidenavUserBlock"> 
    <div [fxLayout]="(settings.menuType != 'default') ? 'column' : 'row'" 
         [fxLayoutAlign]="(settings.menuType != 'default') ? 'center center' : 'space-around center'" class="user-info-wrapper">
        <div class="user-info">
            <p class="name"> {{currentUser}}</p>
            <p *ngIf="settings.menuType == 'default'" class="position">Rocket Scientist<br> </p>
        </div>
    </div>
    <div *ngIf="settings.menuType != 'mini'" fxLayout="row" fxLayoutAlign="space-around center" class="w-100 muted-text"> …
Run Code Online (Sandbox Code Playgroud)

angular-material angular angular-test angular5

1
推荐指数
1
解决办法
2313
查看次数

如何从测试代码中触发 Angular Material MatSelect 上的 selectionChange 事件

我有一个嵌入 Angular MaterialMatSelect元素的组件。

在我正在编写的测试中,我需要模拟某个选项的选择,并确保selectionChange与该MatSelect元素关联的Observable实际触发。

到目前为止我的代码是

const mySelect: MatSelect = fixture.nativeElement.querySelector('#mySelect');
mySelect.value = 'new value';
Run Code Online (Sandbox Code Playgroud)

但不幸的是mySelect.selectionChange,这并没有发出通知,因此我的测试工作。非常欢迎有关如何执行此操作的任何想法。

angular-material angular angular-test

1
推荐指数
2
解决办法
4051
查看次数

为 Angular 8 测试设置顺序

我的一项测试随机失败。我想设置一些调试顺序,因为默认情况下测试使用种子随机运行。我试图在karma.conf.js或设置种子数,random: false但没有效果。我使用默认测试配置并使用ng test. 我的变化karma.conf.js

client: {
   ...
   random: false,
   //or
   seed: '71384' 
   ...
}
Run Code Online (Sandbox Code Playgroud)

karma-jasmine angular angular-test angular8

1
推荐指数
1
解决办法
3134
查看次数

测试来自 Angular 属性指令的点击

我在为我编写的 Angular 属性指令创建单元测试时遇到问题。该指令称为TrackClickDirective,我正在尝试测试以下内容。

  • 当单击附加了此指令的元素时,它应该调用该指令的特定方法。

我怀疑这是我的单元测试配置有问题。

请参阅我在 StackBlitz 上的实现,您可以在其中看到测试正在运行:

StackBlitz: https ://stackblitz.com/edit/angular-test-click-on-attribute-directive-with-hostlistener

这是我的单元测试代码 - track-click.directive.spec.ts

import { Component, ElementRef, DebugElement } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from "@angular/platform-browser";
import { TrackClickDirective } from './track-click.directive';
import { Analytics} from './analytics.service';

class MockAnalytics {
  eventTrack() {}
};
class MockElementRef {
}

@Component({
  template: '<button appTrackClick>Test</button>'
})
export class TestButtonWithoutNameComponent { }

describe('TrackClickDirective', () => {

  let component: TestButtonWithoutNameComponent;
  let fixture: ComponentFixture<TestButtonWithoutNameComponent>;
  let …
Run Code Online (Sandbox Code Playgroud)

angular-directive angular angular-test

0
推荐指数
1
解决办法
1588
查看次数