【问题标题】:Understanding state in jest tests that use spyOn了解使用 spyOn 的玩笑测试中的状态
【发布时间】:2020-11-02 01:33:54
【问题描述】:

假设我有一个测试文件foo.test.ts,看起来像这样:

describe("foo", function() {
  let myMock;

  beforeAll(function() {
    myMock = jest.spyOn(someObject, "someMethod");
  });

  test("my test", function() {
    beforeEach(function() {
      myMock.mockReturnValue("someValue");
    });
    ...
  });

  afterAll(function() {
    myMock.mockRestore();
  });
});

我使用这种模式是因为我在其他 StackOverflow 答案中看到了它的推荐。不过我想了解 Jest 的工作原理。

我真的需要将模拟存储在变量中,还是可以这样做?

describe("foo", function() {
  test("my test", function() {
    beforeEach(function() {
      jest.spyOn(someObject, "someMethod").mockReturnValueOnce("someValue");
    });
    ...
  });
});

请注意,我使用的是mockReturnValueOnce 而不是mockReturnValue

我运行了这两个实现并且它们运行良好,但我想知道我是否可以说它们是等效的?作为“someObject”的一部分的“someMethod”函数是否不会保留为来自其他文件的其他测试的模拟?

【问题讨论】:

标签: javascript jestjs


【解决方案1】:

jest.spyOn() 返回一个笑话mock function,并且您希望将返回的模拟函数存储在一个变量中,以便您可以进行断言。

如果你不存储jest.mock()返回的mock函数,那么你将如何进行断言呢? jest 提供的所有可以在模拟函数上调用的方法,如果没有对模拟函数的引用,就无法调用。

如果您只想模拟返回值而不对模拟函数进行任何断言,那么您不需要保存引用。一般来说,当你模拟一个函数时,你想要断言它被调用了多少次,它被调用了哪些参数等等。

“someMethod”函数,“someObject”的一部分,会不会被保留 作为来自其他文件的其他测试的模拟?

someMethod 只会在您模拟它的测试文件中模拟。它不会影响其他测试文件。

【讨论】:

  • 嗯,我想我不应该使用spyOn。我不想对模拟函数做出断言(比如它被调用了多少次)。我只是想模拟一次它的返回值,因为我想测试的其他函数依赖于这个返回值。
  • “我只想模拟一次它的返回值” - 在这种情况下,您不需要保存对模拟函数的引用,您的第二个代码示例将工作正常。
猜你喜欢
  • 2020-11-14
  • 1970-01-01
  • 2021-02-10
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
相关资源
最近更新 更多