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列表。 所以在检查完成之后, httpResponse
variables已经超出了范围。 (我不明白为什么会是这样,因为在这两种情况下都有一个调用它();为什么它在一个情况下它是在另一个级别的函数调用呢?我可能错过了一些关于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) }
想想这样:
-
it()
创build一个testing。 - 所有的调用都在任何testing实际运行之前进行(您必须在运行之前创buildtesting)
- 传递给`before'的函数在创buildtesting之后运行,但在它们运行之前运行。
-
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(); });