diff --git a/index.d.ts b/index.d.ts index 7682daf3ad..06a665a4af 100644 --- a/index.d.ts +++ b/index.d.ts @@ -601,6 +601,14 @@ declare module 'egg' { */ url(name: string, params: any): any; + /** + * Create an anonymous context, the context isn't request level, so the request is mocked. + * then you can use context level API like `ctx.service` + * @member {String} EggApplication#createAnonymousContext + * @param {Request} req - if you want to mock request like querystring, you can pass an object to this function. + * @return {Context} context + */ + createAnonymousContext(req?: Request): Context; /** * export context base classes, let framework can impl sub class and over context extend easily. @@ -659,15 +667,6 @@ declare module 'egg' { middleware: KoaApplication.Middleware[] & IMiddleware; - /** - * Create an anonymous context, the context isn't request level, so the request is mocked. - * then you can use context level API like `ctx.service` - * @member {String} Application#createAnonymousContext - * @param {Request} req - if you want to mock request like querystring, you can pass an object to this function. - * @return {Context} context - */ - createAnonymousContext(req?: Request): Context; - /** * Run async function in the background * @see Context#runInBackground diff --git a/lib/application.js b/lib/application.js index bcf085fa72..75f9df67c6 100644 --- a/lib/application.js +++ b/lib/application.js @@ -205,35 +205,6 @@ class Application extends EggApplication { assign(this[LOCALS], val); } - /** - * Create egg context - * @method Application#createContext - * @param {Req} req - node native Request object - * @param {Res} res - node native Response object - * @return {Context} context object - */ - createContext(req, res) { - const app = this; - const context = Object.create(app.context); - const request = context.request = Object.create(app.request); - const response = context.response = Object.create(app.response); - context.app = request.app = response.app = app; - context.req = request.req = response.req = req; - context.res = request.res = response.res = res; - request.ctx = response.ctx = context; - request.response = response; - response.request = request; - context.onerror = context.onerror.bind(context); - context.originalUrl = request.originalUrl = req.url; - - /** - * Request start time - * @member {Number} Context#starttime - */ - context.starttime = Date.now(); - return context; - } - handleRequest(ctx, fnMiddleware) { this.emit('request', ctx); super.handleRequest(ctx, fnMiddleware); @@ -269,45 +240,6 @@ class Application extends EggApplication { } } - /** - * Create an anonymous context, the context isn't request level, so the request is mocked. - * then you can use context level API like `ctx.service` - * @member {String} Application#createAnonymousContext - * @param {Request} req - if you want to mock request like querystring, you can pass an object to this function. - * @return {Context} context - */ - createAnonymousContext(req) { - const request = { - headers: { - 'x-forwarded-for': '127.0.0.1', - }, - query: {}, - querystring: '', - host: '127.0.0.1', - hostname: '127.0.0.1', - protocol: 'http', - secure: 'false', - method: 'GET', - url: '/', - path: '/', - socket: { - remoteAddress: '127.0.0.1', - remotePort: 7001, - }, - }; - if (req) { - for (const key in req) { - if (key === 'headers' || key === 'query' || key === 'socket') { - Object.assign(request[key], req[key]); - } else { - request[key] = req[key]; - } - } - } - const response = new http.ServerResponse(request); - return this.createContext(request, response); - } - /** * Run async function in the background * @see Context#runInBackground diff --git a/lib/egg.js b/lib/egg.js index 7ba0a6e121..826b3b55f9 100644 --- a/lib/egg.js +++ b/lib/egg.js @@ -3,6 +3,7 @@ const path = require('path'); const fs = require('fs'); const ms = require('ms'); +const http = require('http'); const EggCore = require('egg-core').EggCore; const cluster = require('cluster-client'); const extend = require('extend2'); @@ -456,6 +457,75 @@ class EggApplication extends EggCore { return realClient; }; } + + /** + * Create an anonymous context, the context isn't request level, so the request is mocked. + * then you can use context level API like `ctx.service` + * @member {String} EggApplication#createAnonymousContext + * @param {Request} req - if you want to mock request like querystring, you can pass an object to this function. + * @return {Context} context + */ + createAnonymousContext(req) { + const request = { + headers: { + 'x-forwarded-for': '127.0.0.1', + }, + query: {}, + querystring: '', + host: '127.0.0.1', + hostname: '127.0.0.1', + protocol: 'http', + secure: 'false', + method: 'GET', + url: '/', + path: '/', + socket: { + remoteAddress: '127.0.0.1', + remotePort: 7001, + }, + }; + if (req) { + for (const key in req) { + if (key === 'headers' || key === 'query' || key === 'socket') { + Object.assign(request[key], req[key]); + } else { + request[key] = req[key]; + } + } + } + const response = new http.ServerResponse(request); + return this.createContext(request, response); + } + + /** + * Create egg context + * @method EggApplication#createContext + * @param {Req} req - node native Request object + * @param {Res} res - node native Response object + * @return {Context} context object + */ + createContext(req, res) { + const app = this; + const context = Object.create(app.context); + const request = context.request = Object.create(app.request); + const response = context.response = Object.create(app.response); + context.app = request.app = response.app = app; + context.req = request.req = response.req = req; + context.res = request.res = response.res = res; + request.ctx = response.ctx = context; + request.response = response; + response.request = request; + context.onerror = context.onerror.bind(context); + context.originalUrl = request.originalUrl = req.url; + + /** + * Request start time + * @member {Number} Context#starttime + */ + context.starttime = Date.now(); + return context; + } + } module.exports = EggApplication; diff --git a/test/lib/egg.test.js b/test/lib/egg.test.js index dd7006c830..c20a4f262f 100644 --- a/test/lib/egg.test.js +++ b/test/lib/egg.test.js @@ -365,6 +365,22 @@ describe('test/lib/egg.test.js', () => { assert(triggerCount === 1); }); }); + + describe('createAnonymousContext()', () => { + let app; + before(() => { + app = utils.app('apps/demo'); + return app.ready(); + }); + after(() => app.close()); + + it('should create anonymous context', async () => { + let ctx = app.createAnonymousContext(); + assert(ctx); + ctx = app.agent.createAnonymousContext(); + assert(ctx); + }); + }); }); function readJson(p) {