【问题标题】:mocha pass variable to the next testmocha 将变量传递给下一个测试
【发布时间】:2013-12-14 14:02:27
【问题描述】:
describe('some test', function(){
    // Could put here a shared variable
    it('should pass a value', function(done){
        done(null, 1);
    });
    it('and then double it', function(value, done){
        console.log(value * 2);
        done();
    });
});

上述内容目前不适用于 mocha。

一种解决方案是在测试之间共享一个变量,如上所示。

有了async.waterfall(),这是很有可能的,我真的很喜欢。有什么办法可以在 mocha 中实现它?

谢谢!

【问题讨论】:

    标签: javascript testing mocha.js


    【解决方案1】:

    最好将测试保持隔离,以便一个测试不依赖于另一个测试中执行的计算。让我们将应该通过值的测试称为测试 A,将应该通过值的测试称为测试 B。需要考虑的一些问题:

    1. 测试 A 和测试 B 真的是两个不同的测试吗?如果没有,它们可以合并。

    2. 测试 A 是否旨在为测试 B 提供一个测试夹具?如果是这样,测试 A 应该成为 beforebeforeEach 调用的回调。您基本上通过将数据分配给describe 闭包中的变量来传递数据。

      describe('some test', function(){
          var fixture;
      
          before(function(done){
              fixture = ...;
              done();
          });
      
          it('do something', function(done){
              fixture.blah(...);
              done();
          });
      });
      

    我已经阅读了 Mocha 的代码,并且如果我没有忘记某些内容,则无法调用 describeitdone 回调来传递值。那么上面的方法就是了。

    【讨论】:

    • 嵌套描述呢?我在 before() 方法中获得了一个访问令牌,几乎每个后续测试都需要使用它。
    【解决方案2】:

    非常同意 Louis 所说的,这也是 Mocha 实际上并不支持它的原因。想想你引用的异步方法;如果您的第一个测试失败,那么您将在其余测试中遇到瀑布式失败。

    正如您所说,您唯一的方法是在顶部粘贴一个变量:

    describe('some test', function(){
        var value = 0;
        it('should pass a value', function(done){
            value = 5;
            done();
        });
        it('and then double it', function(done){
            console.log(value * 2); // 10
            done();
        });
    });
    

    【讨论】:

    • 嗨,您的声明的一个小修复(引用 async 的文档):if any of the functions pass an error to the callback, the next function is not executed and the main callback is immediately called with the error... 不过还是谢谢您
    • 是的,但是该方法的问题是您随后完全取消了以下测试的任何执行,而不是第一次测试失败并继续进入下一个阶段 - 这有意义吗?
    • @AnthonyMayfield 发布一些代码? :) 也许是要点。
    • 我现在想通了!在您的示例中,两个测试都是同步的,在我的情况下,我试图在运行一些异步后更新变量。很确定我需要使用 Mocha 的 after 方法,现在阅读文档。不过谢谢你的提议:)
    • 不,原来描述套件是按顺序运行的。谜团已揭开!哈哈
    【解决方案3】:

    也可以添加到套装或上下文对象中。

    在这个例子中,它被添加到西装对象中

    describe('suit', function(){
        before(() => {
            this.suitData = 'suit';
        });
    
        beforeEach(() => {
            this.testData = 'test';
        });
    
    
        it('test', done => {
             console.log(this.suitData)// => suit
             console.log(this.testData)// => test
        })
    });
    

    【讨论】:

    • 请注意,这里的this 与您不使用箭头函数的this 不同......我想。 (至少,就我而言,我试图做的事情没有奏效,直到我意识到我正在混合使用箭头函数和普通函数。) mocha 建议不要使用箭头函数:mochajs.org/#arrow-functions
    • 这是正确的。这仅适用于箭头函数。
    • 和一个非箭头函数的包装
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2021-08-26
    • 2017-04-20
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多