在角度2测试中伪造模块

时间:2017-01-23 06:56:26

标签: unit-testing angular ionic-framework jasmine

我有角度2服务的功能,我想测试。

service.ts

upload(){
  let file = new Transfer();
  file.upload(myfile).then( // my callback );
}

我想使用Transfer在我的测试中模拟jasmine。我在

中尝试了这个

sevice.spec.ts

import { TransferMock as Transfer } from '../mocks/mocks'嘲笑它。但它没有用。这就是我的测试实例化的方式。

describe('authentication service' , () => {
  beforeEach(() => {
    auth = new Service(<any>new HttpMock(), <any>new StorageMock())
  });
  it('initialize authentication',() => {
    expect(auth).not.toEqual(null);
    auth.upload('file'); //it fails here
  });
})

修改

Transfer未在服务中注入。只有一个函数使用Transfer。因此,不注入可以减少应用程序的初始加载时间(我很乐意知道其他意见)。所以我想知道是否有嘲笑它是否以这种方式构建?

修改

虽然我已经接受了Martin的答案,因为这是最好的做法,但是当你使用ionic-native插件时会出现一个问题。如果插件没有浏览器支持,它可能会失败。在这种情况下,当我注入它时发生了错误FileTransfer is not defined。所以我又回来了,寻找建议。

1 个答案:

答案 0 :(得分:4)

为了在测试中为类提供模拟,您需要在实现中注入类。

ngModule添加转移到您的提供商。然后只需将其注入您的服务。

然后,在您的测试中,您可以在{ provide: Transfer, useClass: TransferMock }提供商中使用TestBed

<强>更新

依赖注入的主要目的是使代码可测试并允许模拟 - 伪造 - 服务的存根。

<强>更新

使用Dependancy Injection,您可以为不同的环境配置不同的提供程序集。

例如,如果您在浏览器中运行应用程序,并且在本机移动环境中,则可以更换配置。

在你的模块中你可以有这样的东西:

const TRANSFER_PROVIDER: any;

if (environment.browser) {
  TRANSFER_PROVIDER = Transfer;
} else {
  TRANSFER_PROVIDER = { provide: Transfer, useClass: NativeTransfer }
}

...
providers: [ TRANSFER_PROVIDER ]

NativeTransfer可以是一个简单的存根,除了防止错误之外什么也不做,或者它可以让用户知道他们的浏览器不支持这个功能。