我有角度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
。所以我又回来了,寻找建议。
答案 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可以是一个简单的存根,除了防止错误之外什么也不做,或者它可以让用户知道他们的浏览器不支持这个功能。