【问题标题】:How to test promise scenario with sinon and mocha如何用 sinon 和 mocha 测试 Promise 场景
【发布时间】:2017-10-07 09:34:15
【问题描述】:

想了解如何使用 promises 为以下场景编写测试

注意:以下代码为伪代码

class Service{
  get(){
    return Promise.resolve('hi');
  }
}

class otherObj{
  trigger(a){
    console.log(a);
  }
}

class Caller{
  getData(){
    new Service()
      .get()
      .then((a)=>{console.log('in resolve') otherObj.trigger(a)}, 
            (r)=>{console.log('in reject') otherObj.trigger(r)}
           )
  }
}

在编写测试时,我意识到即使在存根 Service.get() 调用以返回已解决的承诺控制台日志之后,也不会被调用。如何测试这样的场景?

descibe('test', ()=>{
  it('test resolve', ()=>{
    let stub = stub(Service.prototype, 'get').returns(Promise.resove('hi'))
   new Caller().getData();    
    stub.restore();
  })
  it('test reject', ()=>{
   let stub = stub(Service.prototype, 'get').returns(Promise.reject('error'))
   new Caller().getData();
   stub.restore();
  })
})

【问题讨论】:

  • 你需要返回在getData创建的promise

标签: javascript tdd mocha.js sinon chai


【解决方案1】:

我已经稍微重构了您的代码,以便它通过测试。

'use strict';

const chai = require('chai');
const sinon = require('sinon');
const SinonChai = require('sinon-chai');

chai.use(SinonChai);
chai.should();

class Service {
  get() {
    return Promise.resolve('hi');
  }
}

class OtherObj {

  constructor() {

  }

  trigger(a) {
    console.log(a);
  }
}

class Caller {

  constructor(){
    this.otherObj = new OtherObj();
  }

  getData() {
    new Service()
      .get()
      .then((a) => {
        console.log('in resolve');
        this.otherObj.trigger(a);
      }).catch((e) => {
        console.log('in reject');
        this.otherObj.trigger(e);
      });
  }
}


context('test', function() {

  beforeEach(() => {
    if (!this.sandbox) {
      this.sandbox = sinon.sandbox.create();
    } else {
      this.sandbox.restore();
    }
  });

  it('test resolve', () => {
    this.sandbox.stub(Service.prototype, 'get').returns(Promise.resolve('hi'));
    new Caller().getData();

  });

  it('test reject', () => {
    this.sandbox.stub(Service.prototype, 'get').returns(Promise.reject('error'));
    new Caller().getData();

  });

});

您的 sn-p 中存在一些错误,使其无法顺利运行。您处理Service() 承诺链接的方式是错误的。而不是这个

new Service()
      .get()
      .then((a)=>{console.log('in resolve') otherObj.trigger(a)}, 
            (r)=>{console.log('in reject') otherObj.trigger(r)}
           )

你应该这样做

new Service()
      .get()
      .then((a) => {
        console.log('in resolve');
        this.otherObj.trigger(a);
      }).catch((e) => {
        console.log('in reject');
        this.otherObj.trigger(e.message);
      });

处理快乐和悲伤的路径。在您的版本中,您从未在第二次测试中捕获存根抛出的异常。

【讨论】:

  • 测试承诺看起来仍然很棘手,试图获得更多资源感谢您的回答
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 2016-06-11
  • 2013-09-06
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多