【问题标题】:Jasmine Spy On a Typescript Class Get() or Set() functionJasmine Spy On Typescript 类 Get() 或 Set() 函数
【发布时间】:2019-02-16 07:41:49
【问题描述】:

我使用的是 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 它不应该是间谍吗?

【问题讨论】:

  • 你的课好像有点不对劲。我不认为 Typescript 在类级别上有私有修饰符。并且 setter 需要有一个参数才能正常工作,并且不应该返回值。此外,如果这些是方法中的属性,那么它们应该附有this。这是您要测试的实际课程,还是随机示例?第一个解决方案应该对你有用。

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


【解决方案1】:

尝试返回类似“frank”的东西,而不是返回布尔值 true。返回值很可能需要一个字符串值而不是布尔值,这将是问题的原因。

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

然后

expect(spyTemp).toHaveBeenCalled();

【讨论】:

  • 我已经更新了我的问题。字符串确实返回值。但是我对它不是间谍感到错误?我在函数中添加了类型来说明它是字符串还是布尔值。
  • 是同样的错误。获取值很好,但我想测试它是否被调用。
  • 服务类是私有的有什么关系吗?
  • 有趣的是,这很有效。 let spyTemp = spyOnProperty(RandomService, 'dogsFullName', 'get').and.returnValue("frank");
  • 如果您也使用该选项更新您的答案,我会将其标记为正确。
【解决方案2】:

这里有几个选项供您选择:

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');

【讨论】:

  • 你好@Wingnod。我也试过你的,但遇到同样的问题。以及原型错误中不存在变量。
  • 我只是好奇,但看起来你应该在你的打字稿中遇到打字稿编译器错误 - typescriptlang.org/play - 我希望你不介意我问,但你有什么要忽略的吗编译器错误?您的课程似乎无效。我知道这与问题本身无关,但我很感兴趣:)
  • 我没有设置,忽略。这是有效的。在编译期间,它会创建一个未设置 get 方法的变量,如果您同时定义了两者,它会同时添加两者。默认情况下,变量具有 get 和 set 函数。
  • 您已经定义了一个返回值且没有参数的 setter (personsLocation)。那不是真正的二传手,Typescript 应该接受这一点。 Javascript 不在乎,但在语义上它是不正确的。它不是一个 setter,而是一个 getter。不过,如果你一切都好,我就不再提了:)
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多