使用 Chai、Mocha 和 Sinon 為 Google Cloud Function 撰寫簡單的單元測驗時遇到問題,盡管我指的是Google 單元測驗參考檔案但無法理解。
問題
- 我在運行單元測驗時收到以下錯誤訊息。
TypeError: response.status is not a function
- 為什么我需要在呼叫函式時對 Request 和 Response 物件進行型別轉換?在 Google 檔案示例 ( Github ) 中,他們沒有進行型別轉換。
onCalculate(req as Request, res as unknown as Response);
目標: 測驗應該通過
onCalculate.ts
import * as functions from "firebase-functions";
export const onCalculate = functions.https.onRequest((request, response) => {
const param1 = request.body.param1;
const param2 = request.body.param2;
response.status(200).send(calculate(param1 as number, param2 as number));
});
/**
* Function to calculate two numbers
* @param {number} param1
* @param {number} param2
* @return {number}
*/
function calculate(param1: number, param2: number): number {
return param1 param2;
}
onCalculate.spec.ts
import firebase from "firebase-functions-test";
import { Request, Response } from "firebase-functions";
import { stub } from "sinon";
import { assert } from "chai";
import { onCalculate } from "./onCalculate";
const test = firebase();
describe("Calculate", () => {
after(() => {
test.cleanup();
});
it("should return 3", () => {
const req = {
query: {},
body: {
param1: 1,
param2: 2,
},
};
const res = { send: stub() };
onCalculate(req as Request, res as unknown as Response);
assert.ok(res.send.calledOnce);
});
});
uj5u.com熱心網友回復:
您應該存根該res.status()方法,因為res.status(xxx).send()是方法鏈呼叫,您需要使用它sinon.stub().returnsThis()來實作這一點。
Sinon.JS 附帶了一組斷言,這些斷言反映了間諜和存根上的大多數行為驗證方法和屬性,這就足夠了。請參閱assertions,因此您不需要assert從chai包中使用。
req并且res是僅包含我們需要測驗的屬性和方法的模擬物件。對Request和Response介面并不完全滿意,所以我們需要使用型別斷言來告訴 TSC——“這兩個物件的形狀是正確的”。官方 repo 使用 JS,而不是 TS。
例如
onCalculate.ts:
import * as functions from 'firebase-functions';
export const onCalculate = functions.https.onRequest((request, response) => {
const param1 = request.body.param1;
const param2 = request.body.param2;
response.status(200).send(calculate(param1 as number, param2 as number));
});
/**
* Function to calculate two numbers
* @param {number} param1
* @param {number} param2
* @return {number}
*/
function calculate(param1: number, param2: number): number {
return param1 param2;
}
onCalculate.spec.ts:
import firebase from 'firebase-functions-test';
import { Request, Response } from 'firebase-functions';
import sinon from 'sinon';
import { onCalculate } from './onCalculate';
const test = firebase();
describe('Calculate', () => {
after(() => {
test.cleanup();
});
it('should return 3', () => {
const req = {
query: {},
body: {
param1: 1,
param2: 2,
},
};
const res = { status: sinon.stub().returnsThis(), send: sinon.stub() };
onCalculate(req as Request, (res as unknown) as Response);
sinon.assert.calledWithExactly(res.status, 200);
sinon.assert.calledWithExactly(res.send, 3);
});
});
測驗結果:
Calculate
? should return 3
1 passing (4ms)
---------------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
---------------------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
onCalculate.spec.ts | 100 | 100 | 100 | 100 |
onCalculate.ts | 100 | 100 | 100 | 100 |
---------------------|---------|----------|---------|---------|-------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/397954.html
下一篇:測驗函式回傳選項<T>
