如何從測驗(開玩笑)運行 shell 腳本?我試過這個:
var cp = require("child_process");
test("script", async () => {
const script = cp.exec("./scripts/foo.sh");
script.stdout.on("data", (data) => {
console.log("stdout: " data);
});
script.stderr.on("data", (data) => {
console.error("stderr: " data);
});
});
哪里 foo.sh:
#!/usr/bin/env bash
echo "fooooo"
這給出了:
測驗完成后無法登錄。您是否忘記在測驗中等待異步內容?
試圖記錄“stdout:fooooo”
此外,如果我洗掉它仍然不顯示 console.log 輸出
有任何想法嗎?
編輯:“真正的”腳本更復雜:
#!/usr/bin/env bash
echo "start script"
sandbox reset release -v
要使sandbox命令可用,請參閱:
https ://github.com/algorand/sandbox#getting-started
目前,我設法通過在腳本完成所需的時間內安全地設定超時來使其作業,并done()在顯示預期的最后一個日志時呼叫:
test("script", (done) => {
// const script = cp.exec("./scripts/foo.sh");
const script = cp.exec("./scripts/sandbox_dev_reset.sh");
script.stdout.on("data", (data) => {
console.log("stdout: " data);
// this is a string that appears in the last log message
// don't know how to make the test stop (successfully) otherwise
if (
data.includes(
`Soon after sending the transaction it will appear in indexer`
)
) {
console.log("found the string! - done");
done();
}
});
script.stderr.on("data", (data) => {
console.error("stderr: " data);
});
}, 100000);
PS如果有任何幫助,最初這來自Rust測驗,腳本正常完成(程式繼續執行而沒有黑客攻擊):
pub fn reset_network(net: &Network) -> Result<()> {
let mut cmd = Command::new("sh");
cmd
.current_dir(format!("/foo/bar/scripts"))
.arg("./sandbox_dev_reset.sh"),
let reset_res = cmd
.stdout(Stdio::piped())
.spawn()?
.stdout
.expect("Couldn't reset network");
log::debug!("Script cmd stdout: {:?}", reset_res);
for line in BufReader::new(reset_res)
.lines()
.filter_map(|line| line.ok())
{
log::debug!("{}", line);
}
log::debug!("Script finished");
Ok(())
}
uj5u.com熱心網友回復:
請參閱測驗異步代碼:
異步運行的代碼在 JavaScript 中很常見。當您有異步運行的代碼時,Jest 需要知道它正在測驗的代碼何時完成,然后才能繼續進行另一個測驗。Jest 有幾種方法來處理這個問題。
您可以使用回呼。當生成的 shell 中的腳本被執行時,呼叫done()通知 jest 測驗用例已經完成。它用于測驗回呼,否則,測驗用例將不會等待回呼完成。這意味著執行了測驗用例,但未執行您的回呼。它與函式的timeout毫秒選項不同。test()
const cp = require('child_process');
const path = require('path');
test('script', (done) => {
const script = cp.exec(path.resolve(__dirname, './foo.sh'));
script.stdout.on('data', (data) => {
console.log('stdout: ' data);
done();
});
script.stderr.on('data', (data) => {
console.error('stderr: ' data);
done();
});
});
測驗結果:
PASS stackoverflow/74025882/index.test.js
? script (31 ms)
console.log
stdout: fooooo
at Socket.<anonymous> (stackoverflow/74025882/index.test.js:7:13)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.175 s, estimated 10 s
更新:
測驗的默認超時為5000毫秒。如果你的腳本執行時間大于這個值,Jest 會拋出一個超時錯誤。這是它的作業方式。超時機制將中止那些執行時間過長的測驗用例。
您使用功能timeout選項test()是正確的方法。參見示例:
const cp = require('child_process');
const path = require('path');
describe('74025882', () => {
test('script', (done) => {
const script = cp.exec(path.resolve(__dirname, './foo.sh'));
script.stdout.on('data', (data) => {
console.log('stdout: ' data);
done();
});
script.stderr.on('data', (data) => {
console.error('stderr: ' data);
done();
});
}, 10 * 1_000);
});
foo.sh:
#!/usr/bin/env bash
sleep 6
echo "fooooo"
我sleep 6用來模擬你的 Rust 腳本的執行時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515337.html
標籤:节点.js壳开玩笑的
