MochaJS:如何在testing之间共享断言/“它('应该')”代码

我有一些使用NodejstestingWeb服务器的摩卡testing。

许多testing应该会导致服务器返回错误,例如400错误请求。

目前的testing是以下代码的许多副本:

it('should respond with 400 (Bad Request)', function (){ expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST); }); 

这是一个简化的伪代码示例:

 describe('When passing bad JSON data', function(){ var response before(function(done){ callUrlToInsert(url, badJson, function(err, resp){ response = resp done() } } it('should respond with 400 (Bad Request)', function (){ expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST) }) } 

这使我感到困惑,因为作为一名程序员,我尽可能避免了重复的代码。

但是,把它放到一个函数中是行不通的。

 function verifyItReturnedBadRequest400(httpResponse) { it('should respond with 400 (Bad Request)', function (){ expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST); }); } 

因为it()的调用it()并没有testing这个断言的权利。 我的[有限的]理解是, it()添加封闭的testing列表。 所以在检查完成之后, httpResponsevariables已经超出了范围。 (我不明白为什么会是这样,因为在这两种情况下都有一个调用它();为什么它在一个情况下它是在另一个级别的函数调用呢?我可能错过了一些关于JavaScript范围。)

有没有一种常见的方法来避免所有这些重复的代码? 还是每个人都在那里重复所有的断言代码? 这是我第一次进入摩卡,所以我可能错过了一些明显的东西。

此外,解释为什么function方法不起作用的奖励点

谢谢!

我猜你的代码看起来像这样:

 describe('When passing bad JSON data', function(){ var response before(function(done){ callUrlToInsert(url, badJson, function(err, resp){ response = resp done() } } verifyItReturnedBadRequest400(httpResponse) } 

想想这样:

  1. it()创build一个testing。
  2. 所有的调用都任何testing实际运行之前进行(您必须在运行之前创buildtesting)
  3. 传递给`before'的函数在创buildtesting之后运行,但它们运行之前运行。
  4. verifyItReturnedBadRequest400调用it来创build一个testing,但是你正在传递httpResponse,然后在任何testing运行before ,所以before还没有运行。

您可以继续使用这种模式,但是您需要将httpresponse放在一个容器中,以便您可以传递一个引用:

 describe('When passing bad JSON data', function(){ var data = {}; before(function(done){ callUrlToInsert(url, badJson, function(err, resp){ data.response = resp done() } } verifyItReturnedBadRequest400(data) } 

然后你的verifyItReturnedBadRequest400变成:

 function verifyItReturnedBadRequest400(data) { it('should respond with 400 (Bad Request)', function (){ expect(data.response.statusCode).to.equal(httpstatus.BAD_REQUEST); }); } 

有关于这个维基的文章。 https://github.com/mochajs/mocha/wiki/Shared-Behaviours

我想你在testing中有一些错误。 把it()放到包装函数中工作正常。 这是一个小型的演示。

 'use strict'; const assert = require('assert'); const xEqualsOne = () => { it('should be equal 1', () => { assert.equal(this.x, 1); }); }; describe('async number', () => { this.x = 0; before(done => { this.x++ setTimeout(done, 100); }); xEqualsOne(); });