gpt4 book ai didi

node.js - express 中间件测试 mocha chai

转载 作者:IT老高 更新时间:2023-10-28 23:05:11 25 4
gpt4 key购买 nike

有没有办法在 express 中测试这些中间件:

module.exports = function logMatchingUrls(pattern) {
return function (req, res, next) {
if (pattern.test(req.url)) {
console.log('request url', req.url);
req.didSomething = true;
}
next();
}
}

我发现的唯一中间件测试是:

module.exports = function(request, response, next) {
/*
* Do something to REQUEST or RESPONSE
**/

if (!request.didSomething) {
console.log("dsdsd");
request.didSomething = true;
next();
} else {
// Something went wrong, throw and error
var error = new Error();
error.message = 'Error doing what this does'
next(error);
}
};


describe('Middleware test', function(){

context('Valid arguments are passed', function() {
beforeEach(function(done) {
/*
* before each test, reset the REQUEST and RESPONSE variables
* to be send into the middle ware
**/
requests = httpMocks.createRequest({
method: 'GET',
url: '/css/main.css',
query: {
myid: '312'
}
});
responses = httpMocks.createResponse();

done(); // call done so that the next test can run
});

it('does something', function(done) {
/*
* Middleware expects to be passed 3 arguments: request, response, and next.
* We are going to be manually passing REQUEST and RESPONSE into the middleware
* and create an function callback for next in which we run our tests
**/
middleware(responses, responses, function next(error) {
/*
* Usually, we do not pass anything into next except for errors, so because
* in this test we are passing valid data in REQUEST we should not get an
* error to be passed in.
**/
if (error) { throw new Error('Expected not to receive an error'); }

// Other Tests Against request and response
if (!responses.didSomething) { throw new Error('Expected something to be done'); }

done(); // call done so we can run the next test
}); // close middleware
}); // close it
}); // close context
}); // close describe

这适用于上面提供的简单中间件(它就像测试带有回调的基本函数),但对于更复杂的中间件,我无法让它工作。是否可以测试这种中间件?

最佳答案

这是一个您可以使用的简单设置,使用 chaisinon :

var expect = require('chai').expect;
var sinon = require('sinon');

var middleware = function logMatchingUrls(pattern) {
return function (req, res, next) {
if (pattern.test(req.url)) {
console.log('request url', req.url);
req.didSomething = true;
}
next();
}
}

describe('my middleware', function() {

describe('request handler creation', function() {
var mw;

beforeEach(function() {
mw = middleware(/./);
});

it('should return a function()', function() {
expect(mw).to.be.a.Function;
});

it('should accept three arguments', function() {
expect(mw.length).to.equal(3);
});
});

describe('request handler calling', function() {
it('should call next() once', function() {
var mw = middleware(/./);
var nextSpy = sinon.spy();

mw({}, {}, nextSpy);
expect(nextSpy.calledOnce).to.be.true;
});
});

describe('pattern testing', function() {
...
});

});

从那里,您可以为模式匹配等添加更精细的测试。由于您只使用 req.url,您不必模拟整个 Request 对象(由 Express 创建),您可以只使用具有 url 属性的简单对象。

关于node.js - express 中间件测试 mocha chai,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34516951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com