【问题标题】:sinon wont replace dependencysinon 不会取代依赖
【发布时间】:2020-06-08 15:51:43
【问题描述】:

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

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 类的 getResult() 方法进行存根,以便在从我的单元测试中调用它时返回一个预定义的值,但不知道该怎么做。

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】:

    如果你想从类 DependencyClass 中存根方法 getResult(),那么你需要从它创建存根: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 运行它时:

    $ mocha stackoverflow.spec.js 
    
    
      FirstClass.js
        getResult()
          ✓ throws an exception if the result is not returned
    
    
      1 passing (6ms)
    
    $
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2016-06-19
      • 2011-12-18
      相关资源
      最近更新 更多