Bun 1.2.19から、test.each や it.each を使ったパラメタライズドテストにて、ラベルの中の変数展開がサポートされるようになったので、メモ。
例えば、以下のようなテストコードがあるとします。
import { describe, it, expect } from 'bun:test' describe('変数展開', () => { it.each([ { coupon: { name: '1割引', discountRate: 0.1 }, expected: 90 }, { coupon: { name: '3割引', discountRate: 0.3 }, expected: 70 } ])( '$coupon.name のクーポンを使ったときの割引後価格は $expected であること', ({coupon: {discountRate}, expected}) => { expect(100 * (1 - discountRate)).toBe(expected) } ) })
このとき、Bun 1.2.18 までは $coupon.name のクーポンを使ったときの割引後価格は $expected であること の部分では変数展開がされません。
% bun test bun test v1.2.18 (0d4089ea) ... ✓ 変数展開 > $coupon.name のクーポンを使ったときの割引後価格は $expected であること [0.02ms] ✓ 変数展開 > $coupon.name のクーポンを使ったときの割引後価格は $expected であること
Jestではできていることから、Bunのテストランナーでもできるようになるといいなと思いながら、issueを眺めていました。
Implement $var interpolation in test.each · Issue #6306 · oven-sh/bun
そんな中、以下のプルリクが作成・マージされました。
support $variables in test.each by RiskyMH · Pull Request #21061 · oven-sh/bun
その後、1.2.19でリリースされました。
https://bun.sh/blog/bun-v1.2.19#variable-substitution-in-test-each
Bun 1.2.19で上記のテストコードを実行したところ、変数展開が行われました。 coupon.name のようなオブジェクトも展開されています。
% bun test bun test v1.2.19 (aad3abea) ... ✓ 変数展開 > "1割引" のクーポンを使ったときの割引後価格は 90 であること ✓ 変数展開 > "3割引" のクーポンを使ったときの割引後価格は 70 であること
なお、変数にスペースがない場合、変数展開は行われません。例えば、以下のようなスペースのないテストコードを追加します。
describe('変数展開', () => { // ... describe('スペースなし', () => { it.each([ { coupon: { name: '1割引', discountRate: 0.1 }, expected: 90 }, { coupon: { name: '3割引', discountRate: 0.3 }, expected: 70 } ])( '$coupon.nameのクーポンを使ったときの割引後価格は $expectedであること', ({coupon: {discountRate}, expected}) => { expect(100 * (1 - discountRate)).toBe(expected) } ) }) })
この場合は
% bun test bun test v1.2.19 (aad3abea) ✓ 変数展開 > スペースなし > $coupon.name?クーポンを使ったときの割引後価格は $expected?あること [0.68ms] ✓ 変数展開 > スペースなし > $coupon.name?クーポンを使ったときの割引後価格は $expected?あること ✓ 変数展開 > "1割引" のクーポンを使ったときの割引後価格は 90 であること ✓ 変数展開 > "3割引" のクーポンを使ったときの割引後価格は 70 であること
のように、変数展開されず、 ? が付いています。
Bunでパラメタライズドテストを書きやすくなったので、とてもありがたいです。