【问题标题】:Testing Promises in Mocha and Chai在 Mocha 和 Chai 中测试 Promise
【发布时间】:2019-02-04 18:24:20
【问题描述】:
export class YoutubeService {
  getTrendingVideos(country) {
    var params = {
      part: 'snippet',
      chart: 'mostPopular',
      regionCode: country, // should be replaced with country code from countryList
      maxResults: '24',
      key: config.youtubeApi.key
    };
    let result = [];
    let promises = [];
    return axios.get('/', {params}).then(function(res){
      result = res.data.items;
      for (var i = 0; i < result.length; i++) {
          result[i] = {
              id: result[i].id,
              title: result[i].snippet.title,
              thumbnail: result[i].snippet.thumbnails.high.url,
              publishedAt: moment(result[i].snippet.publishedAt).fromNow()
          };
          promises.push(YoutubeService.getVideoDetails(result[i]));
      }
      return Promise.all(promises);
    });
  }

  static getVideoDetails(video) {
    let params = {
      part: 'statistics',
      id: video.id,
      key: config.youtubeApi.key
    };

    return axios.get('/', {params}).then(function(res) {
      let result = res.data;
      video.viewCount = result['items'][0].statistics.viewCount;
      video.likeCount = result['items'][0].statistics.likeCount;
      return video;
    });
  }
}

我不熟悉使用 mocha 和 chai 进行测试,尤其是 promise。如何使用 chai 断言测试这两个函数。 我应该如何对这两个功能进行单元测试 提前致谢。

【问题讨论】:

  • 我个人首先会提取与类不直接相关的代码(例如,params 除了单个属性外始终相同),重构更多(例如,创建视频细节结果请求道具可以独立),使用map之类的东西,构建请求道具数组,测试道具创建者和地图功能,然后做出承诺等。除此之外,我'我很确定我已经看过多个关于测试承诺代码的教程——但我认为如果你提到你遇到的具体问题会很有帮助。

标签: javascript express promise mocha.js chai


【解决方案1】:

您将向it 发送一个函数,该函数将在您完成解析后接收一个要调用的done 函数。

it('does resolve later', function(done) {
    asyncCall().then(()=>{ done(); }
})


it('does resolve later', async function(done) {
    await asyncCall()
    done()
})

你也可以返回一个承诺。

it('does resolve later', function () {
    return asyncCall()
})

【讨论】:

  • 我的 asyncCall() 在这里是什么? getTrendingVideos 还是 getVideoDetails()?
  • 获取视频详情。它调用 getTrendingVideos 并等待它完成。
  • 顺便说一句,你也可以在 Mocha 中返回 Promise,而不是调用 done()
【解决方案2】:

看看Chai as Promised 库,它提供了可链接的eventually,它有助于删除一些期望异步解析的样板:

describe('YoutubeService.getTrendingVideos', function() {
  it('should resolve to expectedResult', function() {
    const params = '';
    const expectedResult = [];
    return getTrendingVideos(params).should.eventually.equal(expectedResult);
  });
});

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2019-09-15
    • 2019-07-18
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多