首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行在“it”规范之后的beforeEach代码

运行在“it”规范之后的beforeEach代码
EN

Stack Overflow用户
提问于 2016-06-20 17:36:41
回答 1查看 60关注 0票数 0

我用摩卡和超级测试来测试一个休息服务。在本例中,我需要测试GET请求之后的后续登录是否返回该GET请求中的查询。

  1. 登录用户
  2. 使用params对端点执行GET请求
  3. 登录用户并期望GET请求中的params作为响应。

由于上面的测试将对不同的端点执行几次,所以我想出了如下内容:

代码语言:javascript
运行
复制
/*
 * getRequest.js
 */
'use strict';

var request = require('supertest')
    , verifyUrl = require('./verifyUrl') // verifies basic url formatting
    ;

module.exports = getRequest;

/**
 * Perform GET request using given parameters and call next when finished.
 * @param getEnvironment {json}
 * @param getEnvironment.url {string}
 * @param getEnvironment.endPoint {string}
 * @param getEnvironment.authorization {string}
 * @param next {function} The callback
 */
function(getEnvironment, getParams, next) {
    var url = verifyUrl(getEnvironment.url);
    request(url)
        .get(getEnvironment.endPoint)
        .set("authorization", getEnvironment.authorization)
        .set('Accept', 'application/json')
        .query(getParams)
        .end(next)
}
代码语言:javascript
运行
复制
/*
 * loginWithCallback.js
 * 
 * Performs a basic login but depends on the callback to test the results of the login.
 */
'use strict';

var request = require('supertest')
    , VerifyUrl = require('./VerifyUrl')
    ;

module.exports = LoginWithCallback;

/**
 * Perform basic login, then call next passing in err and res for testing.
 *
 * @param setEnvironment {json}  Expects url and authorization. Any other parameters will be ignored.
 * @param setEnvironment.url {string} The url being tested.
 * @param setEnvironment.authorization {string} 
 * @param next {function} callback function that will perform the actual test.
 */
function LoginWithCallback(setEnvironment, next) {

    var url = VerifyUrl(setEnvironment.url);

    request(url)
        .post('api/users/login')
        .set('authorization', setEnvironment.authorization)
        .set('Accept', 'application/json')
        .end(next);
}
代码语言:javascript
运行
复制
/*
 * e2eTest.js
 */
'use strict';

var base64_encode = require('Base64').btoa
    , should = require('should')
    , jsonValidator = require('is-my-json-valid')
    , mergeJSON = require('lodash/merge')
    , lodashClone = require('lodash/clone')
    , responseSchema = require('./responseSchemas/200.json')
    , login = require('./loginWithCallback')
    , getRequest = require('./getRequest')
    ;

var username = "newUser" + Date.now()
    , password = "passW0rd"
    , testEnvironment = {
        "url": "http://localhost:9000/",
        "endPoint": "api/users/login",
        "authorization": "Basic " + base64_encode(username + ":" + password)
    }
    ;

var expectedResult = {};

describe('End to End testing on' + JSON.stringify(testEnvironment), function () {
    describe('new user, ' + username + ', login', function () {
        it('should return 200 and an empty body message.', function (done) {
            login(testEnvironment, function (err, res) {
                if (err) {
                    done(err);
                }

                res.statusCode.should.deepEqual(200);

                var jsonValidate = jsonValidator(responseSchema, {verbose: true});
                jsonValidate(res.body).should.be.true("Response body failed schema check: \n" +
                    JSON.stringify(jsonValidate.errors, null, 4));

                res.body.should.deepEqual(expectedResult);

                done();
            });
        });
    });


    describe('user, ' + username + ', logs in after performing get request', function () {
        var getRequestParams = {"firstName":"john", "lastName":"doe"};

        beforeEach(function() {
            var getEnviron = lodashClone(testEnvironment);
            getEnviron.endPoint = 'api/persons/findName';
            mergeJSON(expectedResult, {"persons": {"findName": getRequestParams}});
            getRequest(getEnviron, getReqestParams, function(err, res) {
                if (err) {
                    done(err);
                }
                console.log("GET request: " JSON.stringify(res, null, 2));
                done();
            });
        });

        it('should return 200 and query values', function(done) {
             login(testEnvironment, function (err, res) {
             if (err) {
                 done(err)
             }

             console.log("it test: " + JSON.stringify(res, null, 2));

             res.statusCode.should.deepEqual(200);

             var jsonValidate = jsonValidator(responseSchema, {verbose: true});
             jsonValidate(res.body).should.be.true("Response body failed schema check: \n" + JSON.stringify(jsonValidate.errors, null, 4));

             res.body.should.deepEqual(expectedResult);

             done();

        });
    });
});

上面的三个文件应该做的是: 1.创建一个新用户;2.登录新用户,然后测试它的响应,没有先前的查询参数。(通过) 3.执行GET请求,然后在前一个块4中打印结果。在it块中执行用户的登录、打印和测试结果。

但我得到的是:

代码语言:javascript
运行
复制
End to End testing on{"url":"http://localhost:9000/","endPoint":"api/users/login","authorization":"Basic bmV3VXNlcjE0NjY0NDI0OTEzNDc6cGFzc1cwcmQ="}
  new user, newUser1466442491347, login
    ✓ should return 200 and an empty body message. (54ms)

  user, newUser1466442491347, logs in after performing persons/findByName request
it test: [res text]
    1) should return and query values
GET request: [res text]

1 passing
1 failing

     Uncaught AssertionError: expected Object {} to equal Object {
  persons: Object { findByName: Object { firstName: 'joe', lastName: 'jones' } }
 }

可以看到,“it”块似乎在前一个块完成之前运行。从我对摩卡的阅读来看,这不应该发生,因为它在运行“it”块之前等待“前”和“beforeEach”结束。但是,也许getRequest的回调是在it块之后排队的?

我做错了什么或者误解了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-20 18:06:42

当然,必须设置您的beforeEach钩子,以便Mocha知道它是异步的:要么向Mocha返回承诺,要么使用done回调。为了使用done回调,您必须声明一个接受done的回调

代码语言:javascript
运行
复制
beforeEach(function (done) {

(您可以任意称呼它(例如,finished),只要您是一致的(稍后调用finished() )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37928568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档