2017-08-01 41 views
1

我试图从路由处理模拟功能...我如何存根Hapi处理程序?

这里是我的路线:

server.route({ 
    method: 'GET', 
    path: '/api/color/{format}', 
    handler: this.pingLogic.getPing, 
    config: { 
    description: 'This is ping route', 
    tags: ['api', 'v1', 'ping route'], 
    validate: { 
     params: pingValidator 
    } 
    } 
}) 

getPing功能如下:

getPing(req: HapiRequest, reply: Hapi.ReplyNoContinue): any { 
    req.seneca 
    .act(
     { 
     role: 'color', 
     format: req.params.format, 
     color: 'red' 
     }, 
     (err: any, out: any): any => { 
     return reply(err || out) 
     } 
    ) 
} 

这里是我的测试:

L.test('returns the hello message as text.', (done) => { 
    const ping = new PingLogic; 
    sinon.stub(ping, 'getPing').returns({}); 
    server.inject('/api/color/hex', (response: any) => { 
    expect(response.payload).to.equal({color: 'green'}); 
    done(); 
    }); 
}); 

它不工作它不承认这部分:sinon.stub(ping, 'getPing').returns({}); 任何人都知道如何使这项工作?

回答

0

我刚刚用sinon的proxyquire解决了同样的问题。

const route = proxyquire('./route', { 
 
    './pingLogic': { 
 
    default: sinon.stub().callsArgWith(1, 'response'), 
 
    }, 
 
}).default; 
 

 
server.route(route); 
 

 
server.inject({ request }) // Calls my stub

另一种解决方案可能是这样的:

在你的路由文件:

handler: (request, reply) => { this.pingLogic.getPing(request, reply); }

然后你可以苹果塞进袋子b像往常一样pinglog。

我认为这是因为hapi在你需要的时候注册真实的对象,并且在那之后对它进行存根已经太晚了。如果将它包装在箭头函数中,则在函数绑定到hapi路由对象之前,sinon可以覆盖逻辑。