Angular Jasmine:如何测试包含声明变量的方法

Angular Jasmine:如何测试包含声明变量的方法,angular,jasmine,ionic2,Angular,Jasmine,Ionic2,我正在开发Angular2/Ionic2应用程序。我正在尝试测试一种类似如下的方法: goToFoo(id : number) { let result = this.someService.initialize(); if (result.hasError == false) { switch (result.startPage) { case START_PAGES.OTHER_PAGE: this._nav.setRoot(OtherPage);

我正在开发Angular2/Ionic2应用程序。我正在尝试测试一种类似如下的方法:

goToFoo(id : number) {

  let result = this.someService.initialize();
  if (result.hasError == false) {
  switch (result.startPage) {

    case START_PAGES.OTHER_PAGE:

      this._nav.setRoot(OtherPage);
      break;

    case START_PAGES.FOO:

      this._nav.setRoot(FooPage);
      break;

    default:
      return false;
    }
  }
}
我得到这个错误,指向'if'语句:
TypeError:'undefined'不是对象(正在计算'result.hasError')

以下是我尝试过的:

const mockResult = {
    hasError(){}
}

it("should open foo page", inject((omitted)) => {
    spyOn(mockResult, "hasError");
    const mockId = 123;
    const fooCall = Page.goToFoo(mockId);

    expect(mockResult.hasError).toHaveBeenCalled();  
    expect(fooCall).toEqual(this._nav.setRoot(FooPage));
})); 

我怀疑有更好的方法来测试初始化和使用变量的方法。我没有正确地将mockResult连接到“result”。有什么想法吗?

当您测试函数/方法时,您只能测试某些输入(参数)是否会产生某些预期的输出(返回值)。无法测试这些函数/方法的内部状态。您可以测试此函数的执行在函数外部产生的副作用。例如,如果将变量分配给
this.state=this.someService.initalize()
,则可以在函数完成后测试
this.state
是否有值。

我并不真的想测试内部状态,但测试错误阻止我测试其他任何东西
result
in
let result=this.someService.initialize()不可被测试代码识别,当您需要提供一些模拟
SomeService
使其工作时,它是未定义的。否则您将无法测试它。它正在提供,但我不知道在那之后该如何处理它。我的想法类似于
consttestresult=SomeService.initialize();expect(testResult).tohavebeencall()但这不会影响错误,因为
结果
仍然未定义。您需要设置测试,以便
调用时
goToFoo()
中可以使用此服务。我想当您使用
TestComponentBuilder