typescript 测试涉及打开文件夹/工作区的VSCode扩展

qlckcl4x  于 2023-01-14  发布在  TypeScript
关注(0)|答案(3)|浏览(207)

我正在开发一个VSCode扩展,它考虑了当前在工作区中打开的文件的路径。
因此,为了获得可重现的测试,我尝试在VSCode中打开测试文件夹本身,然后打开其中的测试文件,如下所示:

import * as vscode from "vscode";

test("whatever", async function() {
    let workspaceUri = vscode.Uri.file(__dirname);
    // the tests stop here...
    await vscode.commands.executeCommand("vscode.openFolder", workspaceUri);
    await vscode.workspace.openTextDocument(__filename);
})

问题是当我这样做的时候,正如这里可能提到的,测试在我实际测试代码之前就停止运行了。
是否有一种方法可以安全地打开工作区并在测试期间使用它?

x0fgdtte

x0fgdtte1#

请查看文档以了解测试扩展:Testing-extensions-docs
在正在开发的扩展的**.vscode/launch.json文件中,您可以像这样传递参数**(来自文档):

"args": ["file or folder name", "--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ]

因此,您可以创建一个testing目录结构,其中包含您在config中指定的文件夹中关心的所有文件,并将这些目录/文件添加到您的**.vscodeignore中(默认的test-directory已经在那里了)。
到目前为止,我一直使用的
替代方法是使用bash脚本**,其内容如下:

#!/bin/bash

# $0 = command itself
# $1 = extension-directory(relative path)
# $2 = process-id of code to kill

[ -z "$1" ] && { echo "path-argument not supplied"; exit 1; }
[ -z "$2" ] || { xkill -id $2; }

cd $1
vsce package
file=$(find . -name "*.vsix")
code --install-extension $file
code &
echo $!

剩下的工作就是在启动的代码示例中打开一个文件夹并执行任何有问题的命令。从长远来看,建立一个合适的测试环境对我来说似乎更有好处,至少在可以预测到必须进行许多测试的时候。

k10s72fa

k10s72fa2#

也可以使用***VSBrowser.instance.openResources(路径)***打开VSCode示例中的工作区/文件夹;

import { WebDriver, VSBrowser } from 'vscode-extension-tester';
import path = require('path');
...

suite('Sample Test suite XYZ', () => {
    const test_project_path = path.join(__dirname, "path", "to", "prj");
    
    setup(async () => {
        driver = VSBrowser.instance.driver;
        driver.manage().timeouts().implicitlyWait(1000);
    });

    test("Open a workspace in VSCode instance", async () => {
        await VSBrowser.instance.openResources(path.resolve(test_project_path));
    });

});

...
w8f9ii69

w8f9ii693#

接受的答案在2023年对我不起作用。我无法通过修改launch.json让VS代码打开工作区。
相反,@vscode/test-electron runTests接受一个launchArgs参数,如果第一个参数是一个目录,它将作为工作区打开。

await runTests({extensionDevelopmentPath, 
                extensionTestsPath, 
                launchArgs:[path_to_directory] 
               });

为了进行测试,我将其设置为tmp-promise创建的临时目录。

import * as path from "path";
import { runTests } from "@vscode/test-electron";
import { file, dir } from 'tmp-promise';

async function main() {
  try {
    const extensionDevelopmentPath = path.resolve(__dirname, "../../");
    const extensionTestsPath = path.resolve(__dirname, "./suite/index");

    const {path:tempdir, cleanup} = await dir({unsafeCleanup:true});
    await runTests({extensionDevelopmentPath, 
                    extensionTestsPath, 
                    launchArgs:[tempdir] });
    cleanup();
  } catch (err) {
    console.error("Failed to run tests");
    process.exit(1);
  }
}

main();

sample in the VS Code test repository是一个很好的地方,可以从中找到一个很好的、大概是最新的示例。

相关问题