【问题标题】:How do I carry values from one MochaJS test to another? [duplicate]如何将值从一个 MochaJS 测试传递到另一个? [复制]
【发布时间】:2016-02-18 19:20:03
【问题描述】:

我正在学习如何编写一个针对供应商的 REST API 工作的 NodeJS 模块。模块本身的关键代码已经写好了,但现在我正在尝试学习如何正确地测试它。目前我正在使用 MochaJS 和 ChaiJS 作为测试框架。在一项测试中,我创建了一个返回随机 ID 的用户,我需要保存它。然后稍后我想使用该ID值并测试用户删除。

这是当前不起作用的代码:

var names = require('./names.json');
var ids = [];

describe('users', function() {
  describe('addUser', function (){
    it('should create ' + names[0].firstname, function (done){
      this.slow(3000); this.timeout(10000);
      api.addUser(names[0],function(x){
        x.should.have.property('id').with.length.of.at.least(2);
        ids.push(x.id);
        done();
      });
    });

    it('should create ' + names[1].firstname, function (done){
      this.slow(3000); this.timeout(10000);
      api.addUser(names[1],function(x){
        x.should.have.property('activated').and.equal(true);
        ids.push(x.id);
        done();
      });
    });
  });

  describe('deleteUser', function (){
    for(var a=0;a<ids.length;a++){
      it('should delete ' + ids[a], function (done){
        api.deleteUser(ids[a],function(x){
          x.should.have.property('id').and.equal(ids[a]);
          done();
        });
      });
    }
  });
});

尽管ids 的范围远远超出了测试范围,但不会保存这些值。现在我已经阅读了有关堆栈溢出的其他 cmets,其中响应者基本上说“不要重用值......瀑布失败的东西”。我理解,但对我来说,这就是预期功能 (TM)。如果由于任何原因(我的代码或供应商 API)出现故障并且我无法创建用户,那么显然我将无法删除用户。

我想把所有这些都放到 Travis CI 中,所以我不能指望一个特定的用户总是在那里删除,除非我的测试框架创建的是。我在供应商系统上的用户数量也有限,所以我需要清理我的测试。我还想测试其他用例(例如修改现有用户)。

【问题讨论】:

标签: testing tdd mocha.js


【解决方案1】:

快速回答是您的for 循环永远不会循环。

解析测试文件时,for 循环(在任何测试运行之前,因此在您可以将任何内容推送到ids 之前)执行,并且因为ids 是空的,所以没有工作要做。

为了证明这一点,请将您的代码调整为:

describe('deleteUser', function (){
  console.log("How many IDs?", id);
  for(var a=0;a<ids.length;a++){
    console.log("This will not be seen...");
    it('should delete ' + ids[a], function (done){
      api.deleteUser(ids[a],function(x){
        x.should.have.property('id').and.equal(ids[a]);
        done();
      });
    });
  }
});

解决此问题的绝对最简单的方法是不要遍历 ID,而是删除两个用户,一个接一个地删除,然后检查两个用户是否都成功:

var names = require('./names.json');
var ids = [];

describe('users', function() {
  describe('addUser', function (){
    it('should create ' + names[0].firstname, function (done){
      this.slow(3000); this.timeout(10000);
      api.addUser(names[0],function(x){
        x.should.have.property('id').with.length.of.at.least(2);
        ids.push(x.id);
        done();
      });
    });

    it('should create ' + names[1].firstname, function (done){
      this.slow(3000); this.timeout(10000);
      api.addUser(names[1],function(x){
        x.should.have.property('activated').and.equal(true);
        ids.push(x.id);
        done();
      });
    });
  });

  describe('deleteUser', function (){
    it('should delete users', function (done){
      api.deleteUser(ids[0],function(x){
        x.should.have.property('id').and.equal(ids[0]);
        api.deleteUser(ids[1],function(x){
          x.should.have.property('id').and.equal(ids[1]);
          done();
        });
      });
    });
  });
});

未经测试,远非完美,但应该可以工作。

【讨论】:

  • 对于我的特定问题,你是正确的。 mocha 对事物工作方式的解析对我来说是新的——所以它不会循环运行测试。它也是mocha pass variable to the next test的部分副本。
猜你喜欢
  • 2020-09-04
  • 2019-11-30
  • 2020-06-15
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多