我想测试函数内变量的值,该变量在该函数内多次改变。但是,每当我期望该变量的值时,它就是最新赋值的值。有没有办法检查第一个值是什么?
这是我的密码:
public triggerLogin() {
this.loading = true;
this.requestsService.login(this.userEmail, this.password)
.subscribe( response => this.handleLogin(response))
}
public handleLogin(response) {
if (_.isEqual(response, 'invalid')) {
this.invalid = true;
} else {
this.invalid = false;
this.tokenManager.store(response);
}
this.loading = false;
}
到目前为止我的测试(失败了:预计是虚假的):
it('should start loading as soon as login is triggered', fakeAsync(() => {
spyOn(mockRequestsService, 'login').and.returnValue(Observable.of(token));
component.triggerLogin();
fixture.detectChanges();
expect(component.loading).toBeTruthy();
expect(mockRequestsService.login).toHaveBeenCalled();
}));
正如您所看到的,变量加载首先设置为true
,然后在requestsService
设置为false
的响应中设置。这就是测试期望价值为假的原因。但是,我想测试该变量的第一个赋值。
答案 0 :(得分:1)
单位(在这种情况下,它们是方法)应该单独测试。只有被测试的单位才是真实的,其余部分应该在必要时进行嘲弄/删除。
spyOn(component, 'login');
component.triggerLogin(handleLogin);
expect(component.loading).toBe(true);
expect(mockRequestsService.login).toHaveBeenCalledWith(...);
expect(component.login).toHaveBeenCalledWith(token);
由于我们没有测试这两种方法如何一起发挥(这可以在集成/ e2e测试中另外测试),我们应该一丝不苟。 toHaveBeenCalled
和toHaveBeenCalledWith
并未涵盖可能出错的所有内容。最好还测试login
被调用一次并使用适当的上下文(在被调用时可能会失败,如.subscribe(this.login)
):
expect(component.login.calls.all()).toEqual([
jasmine.objectContaining({ object: component, args: [token] })
]);
然后可以在另一个测试中测试原始login
。