微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Sinon 存根替换整个测试文件的类属性而不是描述块

如何解决Sinon 存根替换整个测试文件的类属性而不是描述块

我正在尝试替换类的静态方法,以便它返回用于测试目的的自定义值。

我的文件中有多个测试(描述)块,我的目标是仅替换其中一个描述块中的静态方法

问题是所有测试都替换了该方法,即使我有一个使用原始方法替换静态方法的拆卸方法

一些代码

class Cat {
    static sound() {
        return "Meow";
    }
}

module.exports = {
    Cat
}
const sinon = require("sinon");

const { Cat } = require("./myClass");

describe("Main tests",() => {
    describe("Test Cat",() => {
        it("Meows",() => {
            expect(Cat.sound()).toBe("Meow")
        })
    })

    describe("Test Dog",() => {
        const stub = sinon
            .stub(Cat,"sound")
            .callsFake(() => "Woof");

        afterall(() => {
            stub.restore();
        });

        it("Barks",() => {
            expect(Cat.sound()).toBe("Woof")
        })
    })
})

测试结果 - 未替换的测试用例失败:

 FAIL  ./index.test.js
  Main tests
    Test Cat
      ✕ Meows (6ms)
    Test Dog
      ✓ Barks

  ● Main tests › Test Cat › Meows

    expect(received).toBe(expected) // Object.is equality

    Expected: "Meow"
    Received: "Woof"

       7 |     describe("Test Cat",() => {
       8 |         it("Meows",() => {
    >  9 |             expect(Cat.sound()).toBe("Meow")
         |                                 ^
      10 |         })
      11 |     })
      12 | 

有没有办法防止这种情况发生? 我尝试使用 createSandBox

const sandBox = sinon.createSandBox()
        const stub = sandBox
            .stub(Cat,"sound") // etc

但都是一样的。

任何帮助将不胜感激。

解决方法

只需使用 jestjs(无需 sinon)即可轻松完成此任务。

只需使用jest.spyOb函数来监听sound函数,你就可以模拟这个函数的结果:

const { Cat } = require('./myClass');

describe('Main tests',() => {
  beforeEach(() => {
    jest.spyOn(Cat,'sound');
  });

  afterEach(() => {
    jest.resetAllMocks();
  });

  describe('Test Cat',() => {
    it('Meows',() => {
      // Don't mock,just call actual logic
      expect(Cat.sound()).toBe('Meow');
    });
  });

  describe('Test Dog',() => {
    it('Barks',() => {
      Cat.sound.mockReturnValue('Woof'); // mock return value of `sound()`

      expect(Cat.sound()).toBe('Woof');
    });
  });
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?