2017-08-01 83 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可以覆蓋邏輯。