gpt4 book ai didi

javascript - 如何使用 Sinon stub ES6 类构造函数

转载 作者:行者123 更新时间:2023-12-01 15:47:41 25 4
gpt4 key购买 nike

我正在尝试使用 Sinon 的 stub 类构造函数。

常规方法“omg”的 stub 工作正常,但构造函数的 stub 未通过测试,并且调用“真实”构造函数而不是 stub 。

关于我需要正确 stub 的语法有什么想法吗?

class Foo {
constructor() {
this.bar = new Bar();
}

omg() {
this.bar.omg();
}
}

class Bar {
constructor() {
console.log('In bar constructor');
}

omg() {
console.log('In bar omg');
}
}

const sandbox = sinon.createSandbox();
sandbox.stub(Bar.prototype, 'constructor');
sandbox.stub(Bar.prototype, 'omg');

describe('Foo', () => {
describe('Constructor', () => {
it('Should instantiate bar', () => {
const foo = new Foo();
expect(Bar.prototype.constructor.called).to.be.true;
});
});

describe('Omg', () => {
it("Should call Bar's omg method', () => {
const foo = new Foo();
foo.omg();
expect(Bar.prototype.omg.called).to.be.true;
});
});
});

最佳答案

它已经超过2年了,这意味着这很难。 :)

当它很难做到时,那么代码需要重构。

下面的示例有效,但在现实世界中可能无法使用(需要在定义 Foo 之前将 Bar 定义为 stub )。

强调:

  • stub calledWithNew()的用法检查 Bar 是否使用 new 调用。
  • 不使用 arrow functions .
  • 柴氏用法expect instanceof ,因为Foo的构造函数会添加property bar,那么,可以添加额外的expectation来检查property bar,即检查Foo的构造函数是否运行。

  • // @file stackoverflow.js
    const sinon = require('sinon');
    const { expect } = require('chai');

    const sandbox = sinon.createSandbox();

    // Define Bar as a stub.
    const Bar = sandbox.stub();
    const BarOmgFn = sinon.fake();
    Bar.prototype.omg = BarOmgFn;

    // class Bar {
    // constructor() {
    // console.log('In bar constructor');
    // }
    // omg() {
    // console.log('In bar omg');
    // }
    // }

    class Foo {
    constructor() {
    this.bar = new Bar();
    }

    omg() {
    this.bar.omg();
    }
    }

    describe('Foo', function () {
    after(function () {
    sandbox.restore();
    });
    describe('Constructor', function () {
    it('Should instantiate bar', function () {
    const foo = new Foo();

    // Check whether Bar called with new.
    expect(Bar.calledWithNew()).to.equal(true);
    // Check bar property.
    expect(foo.bar).to.be.instanceOf(Bar);
    });
    });

    describe('Omg', () => {
    it("Should call Bar's omg method", function () {
    const foo = new Foo();
    foo.omg();

    expect(BarOmgFn.calledOnce).to.equal(true);
    });
    });
    });

    使用 mocha 运行示例:
    $ npx mocha stackoverflow.js


    Foo
    Constructor
    ✓ Should instantiate bar
    Omg
    ✓ Should call Bar's omg method


    2 passing (14ms)

    $

    从设计模式的 Angular 来看,Foo 类高度依赖于 Bar 类。重构可以使用 dependency injection pattern .例如:通过需要 1 个参数,即 Bar 本身或 Bar 的实例,对类 Foo 进行简单更改。此更改使代码更易于测试。

    class Foo {
    // Now constructor need 1 argument
    constructor(Bar) {
    this.bar = new Bar();
    }

    omg() {
    this.bar.omg();
    }
    }


    希望这可以帮助。

    关于javascript - 如何使用 Sinon stub ES6 类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46608799/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com