我有一个我想测试的角度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(new HttpMock(), 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
。所以我又回来了,寻求建议。
为了在测试中为类提供模拟,您需要在实现中注入该类。
在您的ngModule
转移到您的提供程序中。然后只需将其注入您的服务即可。
然后在测试中,您可以{ provide: Transfer, useClass: TransferMock }
在TestBed
提供程序中使用。
更新资料
依赖注入的主要目的是使代码可测试,并允许模拟(假冒)服务存根。
更新资料
使用依赖注入,您可以为不同的环境配置一组不同的提供程序。
例如,如果您正在浏览器中和本地移动环境中运行应用程序,则可以换出配置。
在您的模块中,您可能会遇到以下情况:
const TRANSFER_PROVIDER: any; if (environment.browser) { TRANSFER_PROVIDER = Transfer; } else { TRANSFER_PROVIDER = { provide: Transfer, useClass: NativeTransfer } } ... providers: [ TRANSFER_PROVIDER ]
NativeTransfer可以是一个简单的存根,它只能执行任何操作,但可以防止错误,或者可以让用户知道其浏览器不支持此功能。