Jam*_*sse 6 tdd unit-testing google-apps-script jestjs clasp
我最近了解了CLASP,并对使用TDD在本地编辑我的Google Apps 脚本(GAS)的可能性感到兴奋。
注意:可能有一种方法可以使用现有的 GAS 编辑器编写测试,但如果可能的话,我更愿意使用现代编辑器
clasp 效果很好,但我不知道如何模拟单元测试的依赖项(主要是通过jest,尽管我很高兴使用任何有效的工具)
尽管安装了@types/google-apps-script,但我不清楚如何分别“要求”或“导入”Google Apps Script 模块是使用 ES5 还是 ES2015 语法——请参见下面的说明。
虽然在测试单元中的相似,所以问题在这里,大部分的内容/评论似乎是从预扣时代,我无法在一个解决方案,同时跟进余下的引线到达。(当然,我未经训练的眼睛很可能漏掉了一些东西!)。
正如我上面提到的,在使用 gas-local 时尝试模拟多个依赖项后,我创建了一个问题(见上面的链接)。我的配置类似于jest.mock我在下面描述的测试,但值得注意的是以下差异:
gas-local测试LedgerScripts.test.js
import { getSummaryHTML } from "./LedgerScripts.js";
import { SpreadsheetApp } from '../node_modules/@types/google-apps-script/google-apps-script.spreadsheet';
test('test a thing', () => {
jest.mock('SpreadSheetApp', () => {
return jest.fn().mockImplementation(() => { // Works and lets you check for constructor calls
return { getActiveSpreadsheet: () => {} };
});
});
SpreadsheetApp.mockResolvedValue('TestSpreadSheetName');
const result = getSummaryHTML;
expect(result).toBeInstanceOf(String);
});
Run Code Online (Sandbox Code Playgroud)
LedgerScripts.js
//Generates the summary of transactions for embedding in email
function getSummaryHTML(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var dashboard = ss.getSheetByName("Dashboard");
// Do other stuff
return "<p>some HTML would go here</p>"
}
export default getSummaryHTML;
Run Code Online (Sandbox Code Playgroud)
结果(运行jest命令后)
Cannot find module '../node_modules/@types/google-apps-script/google-apps-script.spreadsheet' from 'src/LedgerScripts.test.js'
1 | import { getSummaryHTML } from "./LedgerScripts.js";
> 2 | import { SpreadsheetApp } from '../node_modules/@types/google-apps-script/google-apps-script.spreadsheet';
| ^
3 |
4 | test('test a thing', () => {
5 | jest.mock('SpreadSheetApp', () => {
at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:307:11)
at Object.<anonymous> (src/LedgerScripts.test.js:2:1)
Run Code Online (Sandbox Code Playgroud)
作为参考,如果我转到google-apps-script.spreadsheet.d.ts具有我想要的类型的文件,我会在文件顶部看到以下声明...
declare namespace GoogleAppsScript {
namespace Spreadsheet {
Run Code Online (Sandbox Code Playgroud)
...以及文件底部的这个:
declare var SpreadsheetApp: GoogleAppsScript.Spreadsheet.SpreadsheetApp;
Run Code Online (Sandbox Code Playgroud)
所以也许我只是导入SpreadsheetApp错误?
开玩笑的配置文件
module.exports = {
clearMocks: true,
moduleFileExtensions: [
"js",
"json",
"jsx",
"ts",
"tsx",
"node"
],
testEnvironment: "node",
};
Run Code Online (Sandbox Code Playgroud)
babel.config.js
module.exports = {
presets: ["@babel/preset-env"],
};
Run Code Online (Sandbox Code Playgroud)
包.json
{
"name": "ledger-scripts",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest"
},
"author": "",
"license": "ISC",
"dependencies": {
"@babel/core": "^7.11.1",
"@babel/preset-env": "^7.11.0",
"@types/google-apps-script": "^1.0.14",
"@types/node": "^14.0.27",
"babel-jest": "^26.3.0",
"commonjs": "0.0.1",
"eslint": "^7.6.0",
"eslint-plugin-jest": "^23.20.0",
"gas-local": "^1.3.1",
"requirejs": "^2.3.6"
},
"devDependencies": {
"@types/jasmine": "^3.5.12",
"@types/jest": "^26.0.9",
"jest": "^26.3.0"
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您的问题范围很广,可能需要澄清。
clasp 效果很好,但我不知道如何模拟单元测试的依赖项(主要是通过玩笑,虽然我很高兴使用任何有效的工具)
您不需要 Jest 或任何特定的测试框架来模拟全局 Apps 脚本对象。
// LedgerScripts.test.js
import getSummaryHTML from "./LedgerScripts.js";
global.SpreadsheetApp = {
getActiveSpreadsheet: () => ({
getSheetByName: () => ({}),
}),
};
console.log(typeof getSummaryHTML() === "string");
Run Code Online (Sandbox Code Playgroud)
$ node LedgerScripts.test.js
true
Run Code Online (Sandbox Code Playgroud)
所以也许我只是错误地导入了 SpreadsheetApp?
是的,导入.d.tsJest是不正确的。Jest 不需要SpreadsheetApp. 你可以省略它。您只需要稍微修改上面的 Jest 示例即可。
// LedgerScripts.test.js - Jest version
import getSummaryHTML from "./LedgerScripts";
global.SpreadsheetApp = {
getActiveSpreadsheet: () => ({
getSheetByName: () => ({}),
}),
};
test("summary returns a string", () => {
expect(typeof getSummaryHTML()).toBe("string");
});
Run Code Online (Sandbox Code Playgroud)
尽管安装了@types/google-apps-script,但我不清楚如何“要求”或“导入”Google Apps Script 模块,无论是使用 ES5 还是 ES2015 语法
@types/google-apps-script不包含模块,您不导入它们。这些是TypeScript 声明文件。您的编辑器(如果它支持 TypeScript)将在后台读取这些文件,并且突然之间您将能够获得自动完成功能,即使在纯 JavaScript 文件中也是如此。
export default foo,则导入时不带花括号:import foo from "foo.js"但如果使用,export function foo() {则使用花括号:import { foo } from "foo.js"| 归档时间: |
|
| 查看次数: |
618 次 |
| 最近记录: |