2017-02-23 79 views
0

我想要得到承诺的结果before摩卡 - 检索承诺测试的结果

describe('unsubscribe', function() { 
     var arn; 
     this.timeout(10000); 
     before(function(done) { 
      sns.subscribe('param1', 'param2').then(
       (result) => { 
       arn = result; 
       done(); 
      }, 
      (error) => { 
       assert.fail(error); 
       done(); 
      }); 
     }); 
     it('("param") => promise returns object', function() { 
      const result = sns.unsubscribe(arn); 
      expect(result).to.eventually.be.an('object'); 
     }); 
    }); 

同样,在after我想获得承诺的结果,在测试

describe('subscribe', function() { 
     var arn; 
     this.timeout(10000); 
     it('("param1","param2") => promise returns string', function(done) { 
      sns.subscribe('param1', 'param2').then(
       (result) => { 
        arn = result; 
        expect(result).to.be.a('string'); 
       }, 
       (error) => { 
        assert.fail(error); 
        done(); 
       }); 
     }); 
     after(function(done) { 
      sns.unsubscribe(arn).then(
       (result) => done()); 
     }); 
    }); 

这段代码写得好吗?有没有更好的做法?推荐的方式是什么?

回答

1

每一个你想让摩卡等待承诺解决的地方,你应该回复承诺,而不是使用done。所以,你的before钩可以简化为:

before(() => sns.subscribe('param1', 'param2') 
     .then((result) => arn = result)); 

这比在这里和那里有done和不必做什么特别的错误条件更具有可读性。如果出现错误,诺言将拒绝,摩卡将抓住它并报告错误。没有必要执行你自己的断言。

你有一个测试和一个after挂钩,也可以通过返回他们使用的承诺而不是使用done来简化。如果你测试取决于承诺,请记住返回。你忘了在你的一个测试:

it('("param") => promise returns object', function() { 
    const result = sns.unsubscribe(arn); 
    // You need the return on this next line: 
    return expect(result).to.eventually.be.an('object'); 
}); 

提示:如果你有一个测试套件中的所有测试都是异步的,你可以使用--async-only选项。这将使摩卡要求所有的测试呼吁done或返回一个承诺,并可以帮助你忘记返回承诺的情况。 (否则,这样的情况是很难,如果他们没有提出任何错误。)

定义回调一个变量describe并在before/beforeEach挂钩的一个设置,并在after/afterEach钩检查它的标准方式在钩子和测试之间传递数据。摩卡没有提供特别的设施。所以,是的,如果您需要传递承诺结果的数据,您需要像执行.then一样执行任务。您可能会遇到一些示例,其中使用describe回调中定义的变量而不是使用变量的人员将在this上设置字段。噢,这可行,但海事组织是脆弱的。一个非常简单的例子:如果你设置this.timeout来记录一些只对你的测试有意义的数字,那么你已经覆盖了Mocha提供的用于改变其超时的功能。你可以使用另一个不冲突的名字,但会在新版本的Mocha发布时发生冲突。

+0

谢谢你的回答。还有一个问题:如果测试承诺的返回结果有许多“期望”,那么怎么样?什么时候会被退回? – necroface

+1

'chai-as-promised'的断言是承诺,所以你可以使用'then'将它们链接成任何承诺。你可能会返回expect(result).to.eventually.be.an(“object”)。then(()=> expect(otherResult).to.eventually.be.whatever)' – Louis