Angular2单元测试 - 如果之后函数内部发生变化,则测试函数中的第一个变量值

时间:2017-08-18 20:25:10

标签: angular unit-testing typescript

我想测试函数内变量的值,该变量在该函数内多次改变。但是,每当我期望该变量的值时,它就是最新赋值的值。有没有办法检查第一个值是什么?

这是我的密码:

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的响应中设置。这就是测试期望价值为假的原因。但是,我想测试该变量的第一个赋值。

1 个答案:

答案 0 :(得分:1)

单位(在这种情况下,它们是方法)应该单独测试。只有被测试的单位才是真实的,其余部分应该在必要时进行嘲弄/删除。

spyOn(component, 'login');
component.triggerLogin(handleLogin);
expect(component.loading).toBe(true);
expect(mockRequestsService.login).toHaveBeenCalledWith(...);
expect(component.login).toHaveBeenCalledWith(token);

由于我们没有测试这两种方法如何一起发挥(这可以在集成/ e2e测试中另外测试),我们应该一丝不苟。 toHaveBeenCalledtoHaveBeenCalledWith并未涵盖可能出错的所有内容。最好还测试login被调用一次并使用适当的上下文(在被调用时可能会失败,如.subscribe(this.login)):

expect(component.login.calls.all()).toEqual([
  jasmine.objectContaining({ object: component, args: [token] })
]);

然后可以在另一个测试中测试原始login