sinon不会替换依赖项

问题描述 投票:0回答:1

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

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
};

[我试图对getResult()类的DependencyClass方法进行存根处理,以便从我的单元测试中调用它时会返回预定义的值,但无法弄清楚该怎么做。

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。

javascript node.js unit-testing chai sinon
1个回答
1
投票

如果要对类getResult()中的方法DependencyClass进行存根,则需要从中创建存根:sinon.stub(DependencyClass.prototype, 'getResult');

这里是完整的示例。

注意:我删除了所有异步等待,因为对于这个简单的示例来说是不必要的。

文件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 stackoverflow.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 stackoverflow.spec.js 


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


  1 passing (6ms)

$

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.