Jasmine Spy在Typescript类的Get()或Set()函数上

时间:2018-09-11 18:24:27

标签: angular typescript unit-testing jasmine karma-jasmine

我正在使用Jasmine 2.9,并且在监视某个函数(无论是公共函数还是私有函数)时都没有遇到问题,但是我很难在类级别上尝试监视getset函数。

private class RandomService {
  public dogsHealth = 0;

  private get personsFullName(): string {
    return firstName + lastname;
  }

  private set personsLocation(address: string, city: string, country: string): string {
    return address + city + country;
  }

  public get dogsFullName(): string {
    return dogFirstName + dogLastName;
  }

  public get isDogAlive(): boolean {
    return dogsHealth <= 0 ? true : false;
  }
}

我尝试过的解决方案:

spyOnProperty(RandomService, 'dogsFullName', 'get').and.returnValue(true);
spyOnProperty(RandomService, 'dogsFullName').and.returnValue(true);
spyOn(RandomService, 'dogsFullName').and.returnValue(true);
spyOnProperty(RandomService.dogsFullName, 'dogsFullName', 'get').and.returnValue(true);

目前,我尚未在线找到解决方案,但会继续寻找。我知道get或set函数会创建一个变量,所以我认为解决方案4可能会起作用,但仍然没有。

更新

(上面的代码也已更新)。

尝试更新以返回字符串并使用以下茉莉花给我一个错误:

spyOnProperty(RandomService, 'dogsFullName', 'get').and.returnValue('Frank');

Expected a spy, but got 'Frank'

对于功能isDogAlive,我得到以下信息:

<toHaveBeenCalled> : Expected a spy, but got true.

我知道它给了我正确的价值,但是如果我spyOn那就不是间谍吗?

2 个答案:

答案 0 :(得分:4)

不要返回布尔值true,而是尝试返回类似“ frank”的值。返回值很可能期望使用字符串值而不是布尔值,这可能是导致问题的原因。

let spyTemp = spyOnProperty(RandomService, 'dogsFullName', 'get').and.returnValue("frank");

然后

expect(spyTemp).toHaveBeenCalled();

答案 1 :(得分:0)

以下是您的一些选择:

spyOnProperty(RandomService.prototype, 'dogsFullName', 'get').and.returnValue('ben');

// or
service = new RandomService();
spyOnProperty(service, 'dogsFullName', 'get').and.returnValue('ben');

或者如果您的方法在类上是静态的:

export class RandomService {
  static dogFirstName: string;
  static dogLastName: string;

  public static get dogsFullName() {
    return RandomService.dogFirstName + RandomService.dogLastName;
  }
}

spyOnProperty(RandomService, 'dogsFullName', 'get').and.returnValue('ben');