2017-04-25 35 views
0

我想在本地測試我的lambda函數,使用mocha,chai和chai-as-promised來關聯異步。我的lambda使用AWS context.succeed格式來返回結果,而不是回調,我需要保持這種方式。我在下面有一個測試,它返回一個200的狀態代碼,但是當我期望它是400時,它仍然通過測試(誤報)。任何放置在自定義上下文成功函數中的日誌,都不顯示,表明它沒有被擊中,或者我對context.succeed的工作方式有點了解。任何指針將不勝感激。節點單元測試使用context.succeed()的AWS Lambda函數

注 - lambda工作正常,測試是我所有的問題。

這是我迄今爲止的簡單代碼。基本上,我打電話給我的lambda函數,按預期傳遞事件和上下文。當調用context.succeed時,它應該測試傳遞到上下文中的結果。

'use strict'; 
const myHandler = require('../lambdaHandler'); 
const chai = require('chai'); 
const expect = chai.expect; 
const chaiAsPromised = require('chai-as-promised'); 
chai.use(chaiAsPromised); 

describe('myHandler.handler should return with expected statusCodes',() => { 

it('should return a 200 statusCode',() => { 
    myHandler.handler(event, { 
    succeed : (data) => { 
     expect(data).to.eventually.have.property('statusCode'); 
     expect(data.statusCode).to.eventually.equal(400); 
    }, 
    fail : (data) => { 
     expect(data).to.have.property('statusCode'); 
    }, 
    }); 
}); 


}); 
+0

看起來像一個異步問題。在您的it-block回調中添加'done'作爲函數arg。調用'()完成後'你期望的陳述或'做(data.statusCode)'在你失敗的處理程序 – LostJon

+0

這絕對是一個異步的問題,但是這就是爲什麼我用柴作爲-承諾。成功或失敗都不會受到影響,因此完成並不會產生任何影響。我最終通過使用'lambda-tester'來取得我的測試結果。唯一的缺點是,只支持Node 4.3.2。 – jmcgui05

+0

而不是使用chai-as-promise,我通常只是將'done'傳遞給回調函數。代碼往往會變得更長一些,但感覺更自然 – LostJon

回答

0

這裏是我會做什麼:

'use strict'; 
const myHandler = require('../lambdaHandler'); 
const chai = require('chai'); 
const expect = chai.expect; 
const chaiAsPromised = require('chai-as-promised'); 
chai.use(chaiAsPromised); 

describe('myHandler.handler should return with expected statusCodes',() => { 

it('should return a 200 statusCode', (done) => { 
    try{ 
    myHandler.handler(event, { 
    succeed : (data) => { 
     expect(data).to.eventually.have.property('statusCode'); 
     expect(data.statusCode).to.eventually.equal(400); 
     done(); 
    }, 
    fail : (data) => { 
     expect(data).to.have.property('statusCode'); 
     done(); 
    }, 
    }); 
    } catch(err){ 
    done(err.message); 
    } 
}); 


}); 
+0

請多多包涵格式化....還有,在try-catch應當一旦你得到這個工作中移除。從測試開發的角度來看,有時錯誤處理幫助,當你在一個未知的黑洞...... – LostJon

1

我建議你閱讀這篇文章:

https://blog.atomdata.io/serverless-applications-continuous-delivery-with-aws-lambda-and-api-gateway-part-1-unit-tests-e517aa1cd09e

這解釋了這些傢伙是如何單元測試他們的拉姆達的。

+0

謝謝,這是一個偉大的文章,但並不能真正解決手頭的問題,基本上是弄清楚爲什麼我目前的執行情況不起作用。我有其他測試使用lambda-tester等,所以使用無服務器將是一個類似的方法,我認爲。問題是我輸出這個處理函數,並使用context.succeed,它永遠不會被擊中。基本上,一個簡單的節點異步函數被單元測試,但播放不好。 – jmcgui05

0

這是我沒有使用lambda-localjest用於測試由DynamoDB獲取數據的函數(local)什麼的例子:

const lambdaLocal = require('lambda-local'); 
const AWS = require('aws-sdk'); 
const options = { 
    region: 'localhost', 
    endpoint: 'http://localhost:8000' 
} 
AWS.config.update(options); 
const lambda = require('./index'); 

describe('Item',() => { 
    it('returns a list of items', (done) => { 
    lambdaLocal.execute({ 
     event: {}, 
     lambdaFunc: lambda, 
     lambdaHandler: 'handle', 
     profilePath: '~/.aws/credentials', 
     profileName: 'default', 
     timeoutMs: 3000, 
     callback: function(error, data) { 
     expect(error).toBeFalsy(); 
     expect(data).toBeTruthy(); 
     expect(data.Count).toEqual(5); 
     expect(data.Items[0].name).toEqual('Item name'); 
     // ... 
     done(); 
     } 
    }); 
    }); 
});