是否可以 运行 在 Azure 函数中开玩笑 运行 时间?

Is it possible to run Jest in Azure function runtime?

这可能是“您在工作中使用了错误的工具”的情况,但无论如何我都会回答我的问题,因为这是我现在必须处理的问题。

所以,这里是:

我必须制作相对较小的应用程序,这些应用程序会定期 运行 作为 Azure 环境中的功能。这些应用程序执行诸如从 API 获取数据并将该数据存储在 SFTP 服务器上的任务。当我创建这些应用程序时,我将 TDD 方法与 Jest 结合使用。

我想主动应对任何问题,并在功能 运行 安排之前解决它们。如果我 运行 在本地开玩笑,我会注意到这些问题中的任何一个,但我想自动执行此过程。因此,我想知道是否可以从 Azure 功能 运行 这些测试,并在其中一个 运行 失败时让 Azure 警告通知我。

我尝试了什么?

/main_functions_folder
    /jest_function
        - index.js
        - function.json
        - failingTest.test.js
const { exec } = require('child_process');

function checkTests() {
  return new Promise((resolve, reject) => {
    exec('npm run test failingTest.test.js', (error) => {
      if (error) reject(error);
      else resolve();
    });
  });
}

module.exports = async function (context) {
  try {
    await checkTests();
  } catch (err) {
    context.log('tests failed!');
    throw err;
  }
};

T运行形成函数并运行在终端中将其整合到预期的行为中:

const { exec } = require('child_process');

function checkTests() {
  return new Promise((resolve, reject) => {
    exec('npm run test failingTest.test.js', (error) => {
      if (error) reject(error);
      else resolve();
    });
  });
}

async function myTest() {
  try {
    await checkTests();
  } catch (err) {
    console.log('tests failed!');
    throw err;
  }
}

myTest();
tests failed!
node:child_process:399
      ex = new Error('Command failed: ' + cmd + '\n' + stderr);
           ^

Error: Command failed: npm run test failingTest.test.js
FAIL jest_function/failingTest.test.js
  ✕ short test (3 ms)

  ● short test

    expect(received).toBe(expected) // Object.is equality

    Expected: 1
    Received: 0

      1 | test('short test', () => {
    > 2 |   expect(0).toBe(1);
        |             ^
      3 | });
      4 |

      at Object.<anonymous> (jest_function/failingTest.test.js:2:13)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.227 s, estimated 1 s
Ran all test suites matching /failingTest.test.js/i.

    at ChildProcess.exithandler (node:child_process:399:12)
    at ChildProcess.emit (node:events:520:28)
    at maybeClose (node:internal/child_process:1092:16)
    at Process.ChildProcess._handle.onexit (node:internal/child_process:302:5) {
  killed: false,
  code: 1,
  signal: null,
  cmd: 'npm run test failingTest.test.js'
}

蔚蓝

我在 Azure 中部署了该函数并手动 运行 它。这导致了我预期的功能失败,但原因不对。它显示以下错误消息:

Result: Failure Exception: Error: Command failed: npm run test failingTest.test.js sh: 1: jest: Permission denied

我不太确定从这里到哪里去,任何帮助或建议将不胜感激!

不确定您是否可以直接在 Functions 中使用 jest,但我知道您可以 运行 在 Azure Functions 中无头地操纵木偶:

https://anthonychu.ca/post/azure-functions-headless-chromium-puppeteer-playwright/

还有 jest-pupeteer 包,但不确定如果所有 dep 都安装为 运行time dependencies,函数中的 jest 是否有特定限制。

我能够使用 npx 而不是 npm 来完成这项工作:

const { exec } = require('child_process');

function checkTests() {
  return new Promise((resolve, reject) => {
    exec('npx jest jest_function/failingTest.test.js', (error) => {
      if (error) reject(error);
      else resolve();
    });
  });
}

module.exports = async function (context) {
  try {
    await checkTests();
  } catch (err) {
    context.log('tests failed!');
    throw err;
  }
};

查看日志我不太确定“330”到底是什么,但假设它正在安装 jest?

2022-04-19T09:54:06Z   [Information]   Error: Command failed: npx jest
npx: installed 330 in 32.481s

无论如何,我很高兴我现在可以使用它了:)。