我有一个功能的角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。因此,不注入可以缩短应用程序的初始加载时间,我想(很高兴知道其他意见)。所以我想知道,如果它的构造是这样的话,是否还有什么可以模仿的呢?
编辑
虽然我已经接受了马丁的答案,因为它是最好的实践,但它有一个问题,当你使用ionic-native plugins.If插件没有浏览器支持,它可能会失败。在这种情况下,当我使用错误FileTransfer is not defined注入它时,就发生了这种情况。所以我又回来了,寻找建议。
发布于 2017-01-23 07:28:39
为了在测试中为类提供模拟,需要在实现中注入类。
在您的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可以是一个简单的存根,只会防止错误,或者它可以让用户知道他们的浏览器不支持这个特性。
https://stackoverflow.com/questions/41800772
复制相似问题