首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带模拟的Angular 2 TestBed

带模拟的Angular 2 TestBed
EN

Stack Overflow用户
提问于 2016-08-12 17:24:36
回答 2查看 11.3K关注 0票数 7

我正在尝试测试一个使用其他服务的组件。我想通过为服务提供一个模拟来隔离组件。在RC5之前,我可以简单地使用addproviders,它现在已被弃用,并将被下一个RC删除。相反,我必须使用TestBed。当我出于某种原因提供mock angular时,请继续寻找mock所依赖的服务。并抛出一个DI exception。当我提供了所有的依赖项时,测试就可以工作了,但是我不想为每个测试套件重复我自己。这破坏了基本的面向对象原则。我的测试套件:

代码语言:javascript
复制
describe('Component: DummyRestApi', () => {

  class DummyRestApiTestService {

    GetAll() {

      return Rx.Observable.create(observer => {

        let data:Data[] = [];

        data.push({
          id: 0,
          data: 'data'
        });

        observer.next(data);
        observer.complete();

      });
    }

    Add(data) {
    }
  }
  let fixture;
  let myMockWindow:Window;
  // ToDo use the mocks
  beforeEach(() => {
    myMockWindow = <any> {location: <any> {hostname: '127.0.0.1'}};
    TestBed.configureTestingModule({
      declarations: [DummyRestApiComponent],
      providers: [
        // ServerAddressResolverService,
        DummyRestApiComponent,
        // ConfigurationService,
        {provide: DummyRestApiService, useClass: DummyRestApiTestService},
        // {provide: Window, useValue: myMockWindow}
      ],
      imports: [FormsModule, HttpModule]
    });
    TestBed.compileComponents().catch(error => console.error(error));


    // addProviders([
    //   DummyRestApiComponent,
    //   {provide: DummyRestApiService, useClass: DummyRestApiTestService},
    // ]);
  });


  describe('Initializing', () => {

    beforeEach(async(() => {
      console.log('Compiling');
      TestBed.compileComponents().catch(error => console.error(error));
      console.log('Compiling again');
    }));

    it('should create an instance', async(() => {
        var fixture = TestBed.createComponent(DummyRestApiComponent);
        fixture.detectChanges();
        expect(fixture.debugElement.componentInstance).toBeTruthy();
      }
    ));

});

Angular 2.0.0-RC5

EN

回答 2

Stack Overflow用户

发布于 2016-08-27 00:10:48

请注意,Patrick Ineichens answer使用provide,它已被弃用。

代码语言:javascript
复制
 providers: [provide(TodoService, { useValue: this.service })]

应该改为:

代码语言:javascript
复制
 providers: [{provide:TodoService, useValue: this.service }]
票数 6
EN

Stack Overflow用户

发布于 2016-08-25 22:28:47

我刚刚将我的seed项目更新为RC5,并且我的测试套件中的一个简单的todo组件如下所示:

代码语言:javascript
复制
import { provide } from '@angular/core';
import { TestBed, ComponentFixture, async } from '@angular/core/testing';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';

import { TodoModule } from './todo.module';
import { TodoComponent } from './todo.component';
import { Todo, TodoService } from './todo.service';

class MockTodoService {
    get todos$(): Observable<Todo[]> {
        return Observable.of<Todo[]>([
            { task: 'Task 1', description: 'Description 1', completed: false },
            { task: 'Task 2', description: 'Description 2', completed: false }
        ]);
    }

    loadAll() { }

    add(newTodo: Todo) { }
}

describe('TodoComponent', () => {

    beforeEach(() => {
        this.service = new MockTodoService();

        TestBed.configureTestingModule({
            imports: [TodoModule],
            providers: [provide(TodoService, { useValue: this.service })]
        });

        this.fixture = TestBed.createComponent(TodoComponent);
    });

    it('should print out todo tasks', async(() => {
        this.fixture.whenStable().then(() => {
            let element = this.fixture.nativeElement;
            this.fixture.detectChanges();

            expect(element.querySelectorAll('li').length).toBe(2);
        });
    }));

    it('should call the service on init', async(() => {
        this.fixture.whenStable().then(() => {
            spyOn(this.service, 'loadAll');
            this.fixture.detectChanges();

            expect(this.service.loadAll).toHaveBeenCalled();
        });
    }));
});

seed项目本身可以在https://github.com/froko/ng2-seed-webpack上找到

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38914457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档