gpt4 book ai didi

unit-testing - 如何在单元测试中模拟 AngularFire 2 服务?

转载 作者:太空狗 更新时间:2023-10-29 17:01:15 26 4
gpt4 key购买 nike

我正在尝试使用 AngularFire 2 auth 为示例 Angular 2 应用程序设置单元测试,该组件非常简单:

import { Component } from '@angular/core';
import { AngularFire, AuthProviders } from 'angularfire2';

@Component({
moduleId: module.id,
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css']
})
export class AppComponent {
isLoggedIn: boolean;

constructor(public af: AngularFire) {
this.af.auth.subscribe(auth => {
if (auth) {
this.isLoggedIn = true;
} else {
this.isLoggedIn = false;
}
});
}

loginWithFacebook() {
this.af.auth.login({
provider: AuthProviders.Facebook
});
}

logout() {
this.af.auth.logout();
}
}

我所做的只是包装 AngularFire 中的 loginlogout 方法,所以我正在考虑使用模拟来检查是否调用了这些方法,但我我不确定从哪里开始,我尝试在我的规范文件中执行以下操作:

import { provide } from '@angular/core';
import { AngularFire } from 'angularfire2';
import {
beforeEach, beforeEachProviders,
describe, xdescribe,
expect, it, xit,
async, inject
} from '@angular/core/testing';
import { AppComponent } from './app.component';

spyOn(AngularFire, 'auth');

beforeEachProviders(() => [
AppComponent,
AngularFire
]);

describe('App Component', () => {
it('should create the app',
inject([AppComponent], (app: AppComponent) => {
expect(app).toBeTruthy();
})
);

it('should log user in',
inject([AppComponent], (app: AppComponent) => {
expect(app.fb.auth.login).toHaveBeenCalled();
})
);

it('should log user out',
inject([AppComponent], (app: AppComponent) => {
expect(app.fb.auth.logout).toHaveBeenCalled();
})
);
});

但是我不确定如何模拟 loginlogout 方法,因为它们是 auth 属性的一部分,是否存在一种模拟 auth 以及返回的 loginlogout 方法的方法?

最佳答案

在这段代码中:

beforeEach(() => addProviders([
AppComponent,
AngularFire
]);

您设置(或 override )将在您的测试中使用的提供程序。

话虽这么说,你可以创建一个不同的类,如果你愿意,可以创建一个模拟,并且使用 { provide: originalClass, useClass: fakeClass } 符号,提供它而不是 AngularFire 实际类。

像这样:

class AngularFireAuthMock extends AngularFireAuth {           // added this class
public login() { ... }
public logout() { ... }
}

class AngularFireMock extends AngularFire { // added this class
public auth: AngularFireAuthMock;
}

beforeEach(() => addProviders([
AppComponent,
{ provide: AngularFire, useClass: AngularFireMock } // changed this line
]);

并且您测试中的 AngularFire 将是 AngularFireMock

关于unit-testing - 如何在单元测试中模拟 AngularFire 2 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38042941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com