我试图为我的Foxx应用添加一些测试。目前,我需要为Mocha中的每个测试用例重建一条新路线,如下所示:
it('allows POST with JSON encoding', function() {
var app = new Foxx.Controller(applicationContext);
app.post(urlString(), graphqlHTTP({
schema: TestSchema
}));
var res = request(app).post(urlString(), {
body: { query: '{test}' },
json: true
});
expect(res.text).to.equal('{"data":{"test":"Hello World"}}');
});
我在运行测试时遇到此行var app = new Foxx.Controller(applicationContext);
的问题:
TypeError: Cannot read property 'push' of undefined
2016-02-14T12:58:58Z [12527] INFO /my-app at new Controller (/usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/server/modules/org/arangodb/foxx/controller.js:330:19)
2016-02-14T12:58:58Z [12527] INFO /my-app at Context.<anonymous> (/usr/local/var/lib/arangodb-apps/_db/ilearn/my-app/APP/src/__tests__/http-test.js:328:17)
2016-02-14T12:58:58Z [12527] INFO /my-app at Test.Runnable.run (/usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/node/node_modules/mocha/lib/runnable.js:233:15)
2016-02-14T12:58:58Z [12527] INFO /my-app at Runner.runTest (/usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/node/node_modules/mocha/lib/runner.js:390:10)
2016-02-14T12:58:58Z [12527] INFO /my-app at /usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/node/node_modules/mocha/lib/runner.js:473:12
2016-02-14T12:58:58Z [12527] INFO /my-app at next (/usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/node/node_modules/mocha/lib/runner.js:315:14)
2016-02-14T12:58:58Z [12527] INFO /my-app at /usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/node/node_modules/mocha/lib/runner.js:325:7
2016-02-14T12:58:58Z [12527] INFO /my-app at next (/usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/node/node_modules/mocha/lib/runner.js:260:23)
2016-02-14T12:58:58Z [12527] INFO /my-app at /usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/node/node_modules/mocha/lib/runner.js:292:5
2016-02-14T12:58:58Z [12527] INFO /my-app at Function.global.DEFINE_MODULE.exports.nextTick (/usr/local/Cellar/arangodb/2.8.0/share/arangodb/js/common/bootstrap/modules/process.js:26:3)
...基本上说applicationContext.foxxes
是undefined
。
我也理解使用全局applicationContext
进行测试是不明智的。但是我怎样才能创造自己的?我还没有找到任何相关的文件。
答案 0 :(得分:2)
在ArangoDB 2.x中,无法动态创建控制器。控制器只能在通过Foxx服务清单中的controllers
属性加载的文件中创建。虽然它们看起来像常规对象,但正如您所注意到的那样,它们实际上操纵了在加载时定义的神奇applicationContext.foxxes
属性,然后在模块执行时读取。
这意味着您无法在测试中动态使用Foxx.Controller
。但是,您可以使用applicationContext.mount
访问服务的挂载点,并以这种方式构建指向真实控制器的URL。
在ArangoDB 3.0中,可以动态创建路由器(相当于2.x控制器),尽管没有工具可以在测试中动态安装它们或向它们发送虚假请求。
您的示例看起来实际上是在测试GraphQL架构而不是控制器本身。在这种情况下,您可以简单地编写一个测试,将查询传递给模式并直接测试其输出。
或者,您可以将作为请求处理程序传递的回调提取到单独的函数中,并使用伪请求和响应对象测试其行为。
通过ArangoDB的HTTP堆栈的全栈集成测试应该是Foxx测试的最后手段。除了显而易见的性能问题(在请求持续时间内至少捆绑两个线程,实际上不得不点击请求/响应开销本身),如果您的服务在开发模式下运行(即传入),它也会导致意外行为请求可能会导致服务在测试仍在运行时重新加载。)
作为旁注,在控制器,脚本和导出之外的文件中使用applicationContext
是完全可以接受的。上下文始终与文件相关,而不是由整个服务直接共享(尽管它主要只包含服务本身的属性,使其对服务的所有文件显得全局)。因此,只要您不直接操作,大多数情况下您都可以在测试中使用它。配置或清单属性。