sinon 不会取代依赖

sinon wont replace dependency

我正在尝试为下面示例中的 class 编写单元测试。

const DependencyClass = require('../../../../Dependency/src/index').DependencyClass;
const string = 'test';

class FirstClass {
    async getResult() {
        const dependency = new DependencyClass();
        const result = dependency.getResult(string);
        return result;
    }
}

module.exports = {
    FirstClass
};

我正在尝试对 DependencyClass class 的 getResult() 方法进行存根处理,以便在从我的单元测试中调用时它 returns 是一个预定义的值,但无法弄清楚如何去做。

const FirstClass = require('../../lib/FirstClass ').FirstClass;

describe('FirstClass.js', function() {
    describe('getResult()', function() {
        it('throws an exception if the result is not returned', async function() {
            const firstClass = new FirstClass();
            sinon.replace(firstClass.getResult, 'DependencyClass.getResult', function() {
                    const fakeResult =
                    [
                        'test1',
                        'test2'
                    ];
                    return fakeResult;
                });

            const expectedResult =
                [
                    'test1',
                    'test2'
                ];

            const result = await firstClass.getResult();
            expect(result).to.deep.eq(expectedResult);
        });
    });
});

afterEach(function() {
    sinon.restore();
});

我知道 DependencyClass.getResult 不是 firstClass.getResult 对象的 属性,但我很难理解在这种情况下应该如何使用 sinon。

如果你想从 class DependencyClass 存根方法 getResult(),那么你需要从它创建存根:sinon.stub(DependencyClass.prototype, 'getResult');.

这里是完整的例子。

注意:我删除了所有的async await,因为对于这个简单的例子来说是不必要的。

文件DependencyClass.js

// @file DependencyClass.js
class DependencyClass {
  getResult() {
    return 'xxx';
  }
}

module.exports = { DependencyClass };

文件FirstClass.js

// @file FirstClass.js
const { DependencyClass } = require('./DependencyClass.js');

const string = 'test';

class FirstClass {
  getResult() {
    const dependency = new DependencyClass();
    return dependency.getResult(string);
  }
}


module.exports = { FirstClass };

测试规范文件

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

const { DependencyClass } = require('./DependencyClass');
const { FirstClass } = require('./FirstClass');

describe('FirstClass.js', function () {
  describe('getResult()', function () {
    it('throws an exception if the result is not returned', function () {
      // Create fake response.
      const fakeResult = ['test1', 'test2'];
      // Create stub DependencyClass method getResult().
      const stubDependencyGetResult = sinon.stub(DependencyClass.prototype, 'getResult');
      stubDependencyGetResult.returns(fakeResult);

      // Initiate first class.
      const firstClass = new FirstClass();
      // Call firstClass method getResult.
      const result = firstClass.getResult();
      // Check whether the result is correct.
      expect(result).to.deep.equal(fakeResult);
      // Verify stub get called.
      expect(stubDependencyGetResult.calledOnce).to.equal(true);
      // Restore stub.
      stubDependencyGetResult.restore();
    });
  });
});

当我 运行 它使用 mocha 时:

$ mocha Whosebug.spec.js 


  FirstClass.js
    getResult()
      ✓ throws an exception if the result is not returned


  1 passing (6ms)

$

希望对您有所帮助。