[英]How to test an node file, receiving an 'EACCES' error when spawning the function
創建 CLI 時,我想測試我的功能。 為此,我正在使用模塊child_process 。
const path = require('path');
const { execFile } = require('child_process');
describe('cli test', () => {
test('thing', () => {
const myCli = execFile(
`${path.resolve(__dirname, '..')}/cli.js`, ['--foo', 'Bar'],
(err, stdout, stderr) => {
if (err) {
console.log('err: ', err);
}
});
});
但這會產生以下錯誤:
Attempted to log "err: { Error: spawn /projects/cli/src/cli.js EACCES
at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
at onErrorNT (internal/child_process.js:415:16)
at process._tickCallback (internal/process/next_tick.js:63:19)
errno: 'EACCES',
code: 'EACCES',
通過以下命令直接在終端中運行此腳本: $ node cli.js --foo Bar
完美運行。
現在一個建議是chmod +x <file>
那個文件( source )。 但是該測試也應該在 CI 上以及在拉 Git 存儲庫的另一台計算機上工作。
任何的想法?
我建議使用fork
而不是execFile
。
所述
child_process.fork()
方法是一個特殊情形child_process.spawn()
專門用於產生新的Node.js過程。
這將允許您執行 JS 文件而不需要它們是 shell 可執行文件。
據我所知,git 實際上跟蹤文件的可執行位。 正如本文所指出的,有一些事情需要考慮: https : //medium.com/@tahteche/how-git-treats-changes-in-file-permissions-f71874ca239d
另一個解決方案是不依賴./
執行語法(這需要為相應的文件打開可執行位),而是顯式使用 shell 命令:
const path = require('path');
const { execFile } = require('child_process');
describe('cli test', () => {
test('thing', () => {
const myCli = execFile(
`sh ${path.resolve(__dirname, '..')}/cli.js`, ['--foo', 'Bar'],
(err, stdout, stderr) => {
if (err) {
console.log('err: ', err);
}
});
});
請注意我添加到您的代碼中的sh
前綴,這樣您就可以使用sh
命令(它應該在您的所有環境中都可用,例如 CI)來執行文件的內容,而不管文件本身是否可以執行!
嘗試運行命令行 mysql 命令時,我收到來自 child_process.spawn 的 EACCESS -13 錯誤。
我的 PATH 有問題並更新它以添加 /usr/local/mysql/bin/ 解決了問題。
臨時修復是運行export PATH=$PATH:/usr/local/mysql/bin/
。
永久修復是:
sudo nano /etc/paths
/usr/local/mysql/bin
注意:我從一個站點獲得了臨時修復......我不知道為什么它在 bin 的末尾有一個 / 但所有 mysql 可執行文件似乎都可用,而 /etc/paths 文件中沒有它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.