sinon:如何存根整个类,而不仅仅是一个方法

ewo*_*wok 5 javascript unit-testing node.js sinon

我有一个正在测试的类,它创建另一个类的实例。我想删除整个第二个类,以便它的构造函数永远不会被调用。例如,如果我有这样的设置:

测试.js

class Test {
  constructor() {
  }

  func() {
    let foo = new Foo()
    foo.hello()
  }
}
Run Code Online (Sandbox Code Playgroud)

Foo.js

class Foo {
  constructor() {
    this.a = 1
    this.b = 2
    this.c = 3
    console.log('original constructor')
  }

  hello() {
    console.log('original hello')
  }

  goodbye() {
    console.log('original goodbye')
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试文件中,我想以某种方式存根整个类Foo,这样当我运行测试时,Test.func()它就不会调用原始Foo构造函数,而是调用一个返回假Foo对象的存根构造函数。然后我将把helloFoo对象的函数存根到 printstubbed hello而不是original hello.

我怎么能像这样存根整个班级呢?

注意:我不想创建可以在测试文件中使用的存根实例。我需要对构造函数本身进行存根处理,以便如果堆栈中的某些内容调用构造函数,它会返回一个存根实例。

rad*_*rad 5

在 sinon 文档中:

\n\n

如果您想创建 MyConstructor 的存根对象,但不希望调用构造函数,请使用此实用程序函数。

\n\n
var stub = sinon.createStubInstance(MyConstructor)\n
Run Code Online (Sandbox Code Playgroud)\n\n

http://sinonjs.org/releases/v1.17.7/stubs/

\n

  • 我已经尝试过,但它不起作用。看来这将创建我可以在测试文件中使用的对象的存根实例。但它不会存根构造函数本身,因此如果在堆栈上的某个位置调用,它将调用存根构造函数。 (3认同)
  • 执行[此文件](https://pastebin.com/0XjiJUQL)。您将看到,当我从测试文件内部调用“stub.hello()”时,它使用存根方法。但是当我调用“Test.func”,然后创建一个新的“Foo”对象并对其调用“hello()”时,我仍然得到原始的构造函数和方法调用。 (2认同)