2016-05-17 222 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」 –