Angular2 jasmine测试的第三方依赖模拟未正确启动

时间:2017-07-11 12:15:06

标签: angular jasmine angular2-services

所以我想为Angular 2.4.1服务创建一个依赖于Apollo的测试。 在我使用Apollo的服务中,我放置了一个控制台日志,以查看它看到的对象类型,以及函数的结果' watchQuery()'是。我希望日志能够打印出“TEST'”,但我会得到一个未定义的'。

当我只记录' watchQuery'时,它会显示这是一个没有参数的函数。当我更新mock类中的参数时,我将在日志中看到模拟的参数。

所以看起来这个类没有正确启动或者什么。

describe('Service: ViewGraphService', () => {

  let viewGraphsService: ViewGraphsService;
  let apolloMock: Apollo;

  class ApolloMock {
    public watchQuery () {
      return 'TEST';
    }
  };

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        ViewGraphsService,
        {
          provide: Apollo,
          useClass: ApolloMock
        }
      ]
    });
  });

  beforeEach(inject([ Apollo ],
    (apollo: Apollo) => {
      viewGraphsService = new ViewGraphsService(apollo);
      apolloMock = apollo;
    }));

  it('should call apollo when a stream is started', () => {
    // do some tests
  });

我也尝试使用' useFactory',但它给了我相同的结果..

class ApolloMock {
    public watchQuery (a) {
      return 'TEST';
    }
  };

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        ViewGraphsService,
        {
          provide: Apollo,
          useFactory: () => {
            return new ApolloMock();
          }
        }
      ]
    });
  });

我在这里缺少什么?

编辑1

Angular 2 - Unit Testing Observables

尝试了此操作
  beforeEach(() => {
    apolloMock = new ApolloMock();
    TestBed.configureTestingModule({
      providers: [
        ViewGraphsService,
        { provide: Apollo, useValue: apolloMock }
      ]
    });

    viewGraphsService = TestBed.get(ViewGraphsService);
  });

编辑2

因此,将ApolloMock类的新实例直接传递给服务是有效的,但这并不像它的工作方式那样......原因很简单,我的打字现在已经关闭了。 ApolloMock类不符合服务所期望的Apollo类/接口。

  beforeEach(inject([ Apollo ],
    (apollo: Apollo) => {
      viewGraphsService = new ViewGraphsService(new ApolloMock());
      apolloMock = apollo;
    }));

1 个答案:

答案 0 :(得分:0)

不确定是否为时已晚。

我使用了窗口实例,并希望在spec文件中模拟该实例。所以,这就是我所做的。

创建一个类,该类返回窗口对象的引用。

export class WindowReference { public getWindowRef() { return this.window; }}

每次需要窗口时,我都将其称为getWindowRef。 在上面的此类课程规范中,我希望windowRef.getWindowRef()等于window。

现在,假设我在某些A类中使用了此getWindowRef()。

请注意,对 windowRefernce

进行了依赖项注入
export class A { 

console.log(this.windowRefernce.getWindowRef())}

为此创建规格:

provide: WindowRef, useValue: windowReferenceStub

和windowReferenceStub一样:

let windowReferenceStub= {
  getWindowRef: {
    methodName: jasmine.createSpy('methodName'),
  }
};

在每一个之前:

windowRefStub = TestBed.get(WindowRef);