所以我试图获取一个令牌,因为它需要在api身份验证中获取列表。我开始导入angular2-token:
import { Angular2TokenService } from 'angular2-token';
然后我添加了describe块:
describe('ListComponent Tests', () => {
let token: Angular2TokenService;
beforeAll(() => {
token.init();
token.signIn('test@email.com', 'foobar');
}
}
但我收到了错误:
TypeError: Cannot read property 'init' of undefined
现在我不确定如何在测试中真正获得登录令牌。
答案 0 :(得分:0)
您尚未将token
初始化为任何内容,因此错误。当您为被测组件创建服务的模拟时,通常只需为预期要调用的函数创建spy即可。然后在测试中,您只想检查组件是否实际调用了函数。您还需要将实际服务替换为模拟服务,因此您需要将模拟配置为提供者替代。例如
@Component({
...
})
class TestComponent {
constructor(private token: Angular2TokenService) {}
ngOnInit() {
token.init();
}
onLogin(email, password) {
token.signIn(email, password);
}
}
describe('..', () => {
let tokenStub;
let component;
let fixture;
beforeEach(() => {
tokenStub = {
init: jasmine.createSpy('init'),
signIn: jasmine.createSpy('signIn')
}
TestBed.configureTestingModule({
declarations: [ TestComponent ],
providers: [{ provide: Angular2TokenService, useValue: tokenStub }]
})
fixture = TestBed.createComponent(TestComponent);
component = fixture.componentInstance;
})
it('should init the token when component created', () => {
fixture.detectChanges();
expect(tokenStub.init).toHaveBeenCalled();
})
it('should signin token when component login', () => {
component.onLogin();
expect(tokenStub.signIn).toHaveBeenCalledWith('test@email.com', 'foobar')
})
})
您可以看到使用toHaveBeenCalledXxx
方法检查函数是否被调用,这些方法可以带参数。
如果您没有使用TestBed
配置,那么只需执行类似
let tokenStub: Angular2TokenService;
let component;
beforeEach(() => {
tokenStub = {
init: jasmine.createSpy('init'),
signIn: jasmine.createSpy('signIn')
} as Angular2TokenService;
component = new TestComponent(tokenStub);
})
it('..', () => {
component.ngOnInit();
expect(tokenStub.init).toHaveBeenCalled();
})
请务必阅读与上述相关联的间谍文档。你可以用间谍做其他事情,比如让它们返回特定的东西,等等。