【问题标题】:how to check function is called or not in angular?如何检查函数是否以角度调用?
【发布时间】:2018-09-25 06:50:25
【问题描述】:

我正在尝试在 Angular 中测试 component,我需要测试以下内容

  1. 服务函数是否被调用
  2. 如何模拟响应

这是我的代码 https://stackblitz.com/edit/angular-testing-w9towo?file=app%2Fapp.component.spec.ts

spec.ts

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

import { AppComponent } from './app.component';
import { AppService } from './app.service';

describe('AppComponent', () => {
  let fixture:ComponentFixture<AppComponent>,
      component:AppComponent,
      injector:TestBed,
      service:AppService,
      httpMock:HttpTestingController,
      el:HTMLElement;
  beforeEach(async(() => {
    TestBed.configureTestingModule({
       imports: [HttpClientTestingModule],
      declarations: [
        AppComponent
      ],
      providers: [ AppService ]

    }).compileComponents();
  }));

  afterEach(() => {
  //httpMock.verify();
});
  fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
   // injector = getTestBed();
   // service = injector.get(AppService);
   // httpMock = injector.get(HttpTestingController);

    spyOn('appService',getData);


  describe('AppComponent onit test', () => {
  it('should create the app', async(() => {
    expect(true).toBe(true);
  }));
  it('should called appService getData method', async(() => {
    expect(appService.getData).toHaveBeenCalled();
  }));
})
});

出现错误 无法读取 null 的属性 'injector'

【问题讨论】:

    标签: javascript angular unit-testing


    【解决方案1】:

    你可以这样模拟服务:

    const mockPosts: Posts = {
       userId: 10,
       id: 10,
       title: "post",
       body: "post"};
    
    class MockAppService extends AppService{
    
       public getData() {
          return Observable.of(mockPosts)
       }
      }
    

    并在您的提供程序中使用该模拟类而不是服务

     { provide: AppService, useClass: MockAppService },
    

    并添加:

     fixture = TestBed.createComponent(AppComponent);
     component = fixture.componentInstance;
     appservice = TestBed.get(AppService); // this line
    

    您可以监视该服务并返回这样的值

    spyOn(appservice , 'getData').and.returnValue("your value")
    

    最终文件

       import { ComponentFixture,TestBed, async,getTestBed } from '@angular/core/testing';
      import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
      import { HttpClientModule, HttpClient } from '@angular/common/http';
    
      import { AppComponent } from './app.component';
      import { AppService } from './app.service';
      import { Observable } from 'rxjs/Observable';
      import { Posts } from './post.interface';
      import 'rxjs/add/observable/of';
    
      const mockPosts: Posts = 
      {userId: 10,
      id: 10,
      title: "post",
      body: "post",};
     class MockAppService extends AppService {
     public getData(){
        return Observable.of(mockPosts)
       }
     }
    
     describe('AppComponent', () => {
      let fixture:ComponentFixture<AppComponent>,
      component:AppComponent,
      injector:TestBed,
      service:AppService,
      httpMock:HttpTestingController,
      el:HTMLElement;
     beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [HttpClientTestingModule],
      declarations: [
        AppComponent
       ],
       providers: [ 
        { provide: AppService, useClass: MockAppService }
       ]
    
       }).compileComponents();
        fixture = TestBed.createComponent(AppComponent);
        component = fixture.componentInstance;
        service = TestBed.get(AppService)
        // injector = getTestBed();
        // service = injector.get(AppService);
        // httpMock = injector.get(HttpTestingController);
        spyOn(service,'getData');
      }));
    
      afterEach(() => {
      //httpMock.verify();
      });
      fixture = TestBed.createComponent(AppComponent);
      component = fixture.componentInstance;
      service = TestBed.get(AppService)
      // injector = getTestBed();
      // service = injector.get(AppService);
      // httpMock = injector.get(HttpTestingController);
    
      spyOn(service,'getData');
    
    
      describe('AppComponent onit test', () => {
      it('should create the app', async(() => {
        expect(true).toBe(true);
      }));
      it('should called appService getData method', async(() => {
          fixture.detectChanges(); 
         expect(service.getData).toHaveBeenCalled();
      }));
      })
     });
    

    【讨论】:

    • 我不知道为什么我不能分享它,但我用最终文件更新了答案,检查一下
    • 我仍然收到错误stackblitz.com/edit/…
    • 你能再看一遍吗
    • 我已经编辑了答案,您必须在编译后将此代码放入 beforeeach ,fixture = TestBed.createComponent(AppComponent);组件=fixture.componentInstance; service = TestBed.get(AppService) // 注入器 = getTestBed(); // service = injector.get(AppService); // httpMock = injector.get(HttpTestingController); spyOn(service,'getData');
    • 我添加了 import 'rxjs/add/observable/of';我在这里添加了fixture.detectChanges(),它('应该调用appService getData方法',async(() => {fixture.detectChanges(); expect(service.getData).toHaveBeenCalled(); }));跨度>
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    相关资源
    最近更新 更多