2016-05-17 214 views
1

没有要求处理程序我有一个茉莉花测试规范test_spec.js这样的:调用server.inject()POST请求Hapi.js

describe('my tests',() => { 
    it('POST should return 201 created',() => { 
    var req = { 
     method: 'POST', 
     url: '/api/v1.0/message', 
     payload: JSON.stringify({name: 'Ethan'}) 
    }; 
    server.inject(req, res => { 
     expect(res.statusCode).to.equal(201); 
    }); 
    }); 
}); 

API调用的路线是这样的:

var routes = [{ 
    path: '/api/v1.0/message', 
    method: 'POST', 
    handler: function(request, reply) { 
    reply('Success').created(); 
    } 
}]; 
exports.register = function(server, options, next) { 
    server.route(routes); 
    next(); 
} 

但是,当我运行测试时,此特定测试的expect()函数不会被调用,因为server.inject()方法不会调用响应回调。事实上,甚至没有路由处理器方法被调用(我用console.log语句进行检查)。但是,当我更改请求方法以及从POST到GET的路由时,它会起作用,并且测试按预期调用expect()方法。该测试仅适用于POST请求。我做错了吗?

+0

您可以制作一个完整的可运行示例(如果它很大,则从您的应用程序中提取),而不是片段? –

+0

我组合了路由定义和路由处理程序来简化代码。如果我也要在这里粘贴Hapi样板代码,它会让它笨拙。要复制这个,基本上只需要一个Hapi样板并插入上面的路线+处理程序。然后写上述Jasmine测试并通过终端中的'jasmine'命令执行。 – pkout

+1

我不同意。如果您提供了我们可以运行的最小工作示例,则可以更轻松地提供帮助。因为它看起来不错,所以我无法对上述做很多。您的问题可能存在于您提供的内容之外。 –

回答

2

原来,问题出在测试电话describe()在我的问题中发布的片段。我忽略在server.inject()调用中调用done()函数。有一次,我补充说,在POST测试开始变得叫做:

describe('my tests',() => { 
    it('POST should return 201 created', (done) => { 
    var req = { 
     method: 'POST', 
     url: '/api/v1.0/message', 
     payload: JSON.stringify({name: 'Ethan'}) 
    }; 
    server.inject(req, res => { 
     expect(res.statusCode).toEqual(201); 
     done(); 
    }); 
    }); 
}); 

需要调用done()回调并不明显,我从茉莉花文档。该调用是必要的,以便推迟规范完成,直到调用done()(意味着有效载荷已发布)。

+0

我会在调用响应回调时总是使用“return reply” –