teipコマンドをDeno(Typescript)で実装しています。
テストをbatsで書こうとしているのですが、シェルに慣れていなくて複数行の入出力の書き方に苦労しています。
コマンドの処理例
bash
1echo 111\\n222\\n333\\n444\\n555\\n666\\n | deno run -q --allow-run main.ts -l 2,4-5 -- sed 's/./@/' 2> 111 3> @22 4> 333 5> @44 6> @55 7> 666
Deno.argsをmainでパースし、Deno.runで選択された行(上の例だと2,4,5行目)だけ一行づつ処理しstring[]に格納しています。
対象じゃない行は処理せずにstringp[]に格納しています。
最後にstring[]をstdoutに書き出します。
typescript
1async function execCommands( 2 command: string[], 3 input: string 4 ): Promise<Result<string, string>> { 5 const p = Deno.run({ 6 cmd: ["bash"], 7 stdin: "piped", 8 stdout: "piped", 9 stderr: "inherit", 10 }); 11 await p.stdin?.write(utf8Encode(`echo -n ${input} | ${command.join(" ")}`)); 12 await p.stdin?.close(); 13 const exitCode = (await p.status()).code; 14 const output = await p.output(); 15 if (exitCode == 1) { 16 return new Err("teip: Commands failed"); 17 } 18 if (output.length == 0) { 19 return new Err("teip: Output of given commands is exhausted"); 20 } 21 return new Ok(utf8Decode(output)); 22 }
上記の例をbatsのテストケースとし記述しようとしています。
bash
1@test '-l' { 2 actual="$(echo -e 111\\n222\\n333\\n444\\n555\\n666\\n | deno run -q --allow-run main.ts -l 2,4-5 -- sed 's/./@/')" 3 expected='111\\n@22\\n333\\n@44\\n@55\\n666\\n' 4 assert_equal $actual $expected 5}
実行結果
bash
1teip-ts/test [main●] » bats test.sh 2test.sh 3 ✗ -l 4 (from function `assert_equal' in file test_helper/bats-assert/src/assert_equal.bash, line 40, 5 in test file test.sh, line 17) 6 `assert_equal $actual $expected' failed 7 8 -- values do not equal -- 9 expected : @22 10 actual : 111 11 --
テストを実行するとactualもexpectedも想定したものではないものになってしまいます。(特にexpectedの値がなぜこうなるのかよくわからない。)
actualで複数行をパイプで渡す部分がまずいと考えているのですが、どう書くとよいでしょうか?
また、この書き方に限らず標準入出力のテストをシェルで書く際のtipsがあれば教えてください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。