【问题标题】:Injecting a stubbed dependency into an es6 class with Sinon使用 Sinon 将存根依赖注入到 es6 类中
【发布时间】:2017-09-25 18:08:57
【问题描述】:

我有以下模块:

const rp = require('request-promise');

// dummies.repository.js 

exports.getDummiesData = () => {
  const options = {
    url: 'https://api.github.com/users',
    headers: {
      'User-Agent': 'Request-Promise',
    },
    json: true
  };
  return rp(options)
  .then(r => r)
  .catch(err => { throw err; });

}

上述文件是我要测试的类的依赖项。我通过它的构造函数将它注入到下面的类中:

// dummies.service.js
const Dummies = require('./dummies.model');
class DummiesService {
  constructor(dummiesRepository) {
  this.dummiesRepository = dummiesRepository;
 }

 getDummies() {
    return new Promise((resolve, reject) => {
        this.dummiesRepository.getDummiesData()
        .then((response) => {
        // business logic
        const dummies = response.map(d => new Dummies(d));
        resolve(dummies);
       })
       .catch((response) => {
         reject(response);
       });
   });
  }
 }
module.exports = DummiesService;

上面我想用sinon测试方法getDummies。到目前为止,我的方法是将dummiesRepository 存根并在实例化期间将其注入到我的虚拟服务中,但我遇到了一个错误。这是我的测试的样子:

const DummiesService = require('../dummies.service');
const dummiesRepository = require('../dummies.repository');
let dummiesRepositoryStub;

afterEach(() => {
   if(dummiesRepositoryStub){
     dummiesRepositoryStub.restore();
   }
});

describe('unit: dummies.service - when getting dummies data', () => {
  it('it should resolve and return dummies data', () => {
    const dummiesResponse = [
      { id: 1, login: 'dummy1', additionalData: 'data' },
      { id: 2, login: 'dummy2', additionalData: 'data' },
      { id: 3, login: 'dummy3', additionalData: 'data' },
    ];

    dummiesRepositoryStub = sinon
      .stub(dummiesRepository, 'getDummiesData')
      .resolves(dummiesResponse);

    dummiesService = new DummiesService(dummiesRepositoryStub);
    // act + assert
    return dummiesService.getDummies()
      .then((response) => {
        chai.expect(dummiesRepositoryStub.called).to.equal(true);
        chai.expect(response).to.deep.equal(dummiesTransformedModel);
      });
  });

此测试失败,错误为 TypeError: this.dummiesRepository.getDummiesData is not a function。我不确定为什么这不起作用,我将 dummiesRepository 的存根实现注入DummiesService 类。请协助。

【问题讨论】:

  • 那里的第一行缺少单引号。 const rp = require('request-promise); 应该是 const rp = require('request-promise');
  • 谢谢,但这不是我的错误。我刚刚打错了问题

标签: javascript mocha.js sinon stub es6-class


【解决方案1】:

我在上面的代码中找不到进行构造函数注入的方法,但我找到了一种解决方法,允许 sinon 存根我的方法。

我不得不将 dummyRepository 从构造函数依赖项中移除,而仅使用 require 来包含它。如果代码如下所示

const Dummies = require('./dummies.model');
const dummiesRepository = require('./dummies.repository');

class DummiesService {
  constructor() {
    this.dummiesRepository = dummiesRepository;
  }
  getDummies() {
    return new Promise((resolve, reject) => {
      this.dummiesRepository.getDummiesData()
        .then((response) => {
          // business logic
          const dummies = response.map(d => new Dummies(d));
          resolve(dummies);
        })
        .catch((response) => {
          reject(response);
        });
    });
  }
}

module.exports = DummiesService;

并且测试的编写与上面相同,但是在没有dummyRepositoryStub 作为参数的情况下实例化DummyService,一切正常。

这可行,但我仍然想知道是否有办法通过构造函数注入依赖项,因为这种方法需要我重构很多代码。

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 2017-07-08
    • 2016-09-25
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2017-04-27
    相关资源
    最近更新 更多