gpt4 book ai didi

typescript - VSCode : Tests won't proceed after using executeCommand to open a sample project

转载 作者:行者123 更新时间:2023-12-04 12:35:54 24 4
gpt4 key购买 nike

我正在尝试向我正在开发的 Visual Studio Code 扩展添加一些单元测试。我遵循了此处描述的设置扩展测试的方法:https://code.visualstudio.com/api/working-with-extensions/testing-extension

然而,这个秘籍并没有展示任何有用的东西来实际测试一个扩展,只是设置框架。

对于我想做的测试,我想做的第一件事就是 打开示例项目 .这就是我陷入困境的地方。这是只是众多变化中的一种 我试过打开一个项目文件夹:

import assert from 'assert';
import { after, before, it } from 'mocha';
import path from 'path';
import { commands, Extension, extensions, Uri, window } from 'vscode';

suite('Extension Tests', () => {
let extension: Extension<any>;
const projectFolder = Uri.file(path.join(__dirname, '../../../test/suite/sample-project'));

window.showInformationMessage('Start all tests.');

before(() => {
extension = extensions.getExtension('kshetline.ligatures-limited');
const cmd = commands.executeCommand('vscode.openFolder', projectFolder).then(
() => console.log('opened'),
() => console.log('didn\'t open'));
console.log('before');
return cmd;
});

after(() => {
console.log('after');
});

it('should load and activate extension', () => {
assert.ok(extension);
assert.ok(extension.isActive);
});

it('second test', () => {
assert.ok(true);
});
});

如果我拿出 executeCommand ,两个测试都运行并且测试套件正确终止,测试窗口关闭。

如果我离开 executeCommand在,有时两个测试都没有执行,有时只是第一个测试。测试套件不会终止——测试窗口保持打开状态,我必须手动停止测试。

我尝试过的变化:
  • 制作 before功能async , 和 await ing executeCommand .
  • 添加 done参数,适用于 async和非异步,并调用 done()before函数,或在 then executeCommand的条款 promise 。
  • 退不退executeCommand promise 。

  • 很难找到如何正确执行此操作的示例。我查看了一个又一个扩展的存储库,似乎对扩展进行测试并不是很流行。 VSCode 扩展编写者通常不会经常打扰测试。 (也许我遇到的麻烦就是原因?)

    我可以看到示例项目确实打开了,并且我没有看到任何控制台错误表明测试卡住并且无法继续进行的原因。

    最佳答案

    不幸的是,当您打开或关闭文件夹时,vscode 会重新加载窗口。这意味着扩展主机将重新启动并失去与调试器以及当前运行的测试脚本的连接。这就是为什么您的 before函数永远不会返回并且您的测试在中途中止。
    有一个open issue在这种行为上,虽然与测试无关。
    窗口重新加载的原因是,切换工作区可能会改变vscode环境。设置可能会被覆盖,工作区信任更改,正在运行的扩展的整个状态和缓存无效,并且可能会激活不同的扩展。不幸的是,这不会重新加载 --extensionTestsPath 传递给 vscode 的测试,当您的测试代码触发窗口或扩展主机重新加载时,最有可能防止无限循环。

    在问题得到解决之前,您在启动时打开文件夹的方法是正确的。虽然,如果你只是在做 Unit Tests您可以只打开单个文件并直接调用您的命令/事件使用的函数。如果您正在执行端到端或类似用户的测试并拥有与工作区相关的 activationEvents ,您可能无法打开文件夹。
    我找不到任何确认它的文档,但根据我的经验,默认情况下您的扩展是启用的,您可以直接调用任何命令,因此通常不需要打开工作区。

    关于测试文档,我强烈建议遵循 guides on the vscode website .当您使用 yeoman 引导您的扩展时按照那里的建议,您已经设置了一个测试运行程序,包括一些示例代码。它还会生成 launch.json可用于调试您的测试。
    有关更多示例,请查看 vscode 的内置扩展(例如 TypeScript Language Features )或一些 microsofts own extensions .其中大多数包括具有不同复杂性的测试。您可能会找到最适合您的设置的一种。

    示例:使用 runTest来自 vscode-testrunTest vscode 中的函数接受多个选项,包括您在 launch.json 中使用的参数。 :

    # From the typings of vscode-test

    interface TestOptions {
    ...,
    /**
    * Absolute path to the extension root. Passed to `--extensionDevelopmentPath`.
    * Must include a `package.json` Extension Manifest.
    */
    extensionDevelopmentPath: string;
    /**
    * Absolute path to the extension tests runner. Passed to `--extensionTestsPath`.
    * Can be either a file path or a directory path that contains an `index.js`.
    * Must export a `run` function of the following signature:
    *
    * ```ts
    * function run(): Promise<void>;
    * ```
    *
    * When running the extension test, the Extension Development Host will call this function
    * that runs the test suite. This function should throws an error if any test fails.
    *
    */
    extensionTestsPath: string;
    /**
    * A list of launch arguments passed to VS Code executable, in addition to `--extensionDevelopmentPath`
    * and `--extensionTestsPath` which are provided by `extensionDevelopmentPath` and `extensionTestsPath`
    * options.
    *
    * If the first argument is a path to a file/folder/workspace, the launched VS Code instance
    * will open it.
    *
    * See `code --help` for possible arguments.
    */
    launchArgs?: string[];
    }
    编辑 src/test/runTest.ts 应该相当容易脚手架使用 yeoman加载多个工作区并在其中运行特定测试。
    const workspaceTests = [
    { testDir: '../your/tests', workspaceDir: '../your/workspace' },
    ...
    ]

    async function main() {
    try {
    const extensionDevelopmentPath = path.resolve(__dirname, '../../');

    for (const { testDir, workspaceDir } of workspaceTests) {
    const extensionTestsPath = path.resolve(__dirname, testDir);
    const workspacePath = path.resolve(__dirname, workspaceDir);

    // Run tests in the specified workspace
    await runTests({
    extensionDevelopmentPath,
    extensionTestsPath,
    launchArgs: [ workspacePath ]
    });
    }
    } catch (err) {
    console.error('Failed to run tests');
    process.exit(1);
    }
    }

    关于typescript - VSCode : Tests won't proceed after using executeCommand to open a sample project,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61889998/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com