Open4

DenoでBDDテストを書く時の注意

iharuyaiharuya

Deno.test("should return 400 if request invalid", async () => {...})とかするとdeno test --filter "400"でフィルタリングできて便利

ただ、BDDでdescribe, it, beforeEachとか使うとイマイチ調子が悪い。

  • itでフィルタリングできない
  • .onlyをつけると、テストは動くのだけど最後になぜかerror: Test failed because the "only" option was usedって表示される
iharuyaiharuya

https://docs.deno.com/runtime/manual/basics/testing/behavior_driven_development#comparing-to-denotest

BDDの関数たちは内部的にDeno.testとかを使っているから、二つは等価ですよ的なExample, 等価じゃなくてよ?

describe("age", () => {
    let user: User;

    beforeEach(() => {
      user = new User("Kyle");
    });

    afterEach(() => {
      User.users.clear();
    });

    it("getAge", function () {
      assertThrows(() => user.getAge(), Error, "Age unknown");
      user.age = 18;
      assertEquals(user.getAge(), 18);
    });

    it("setAge", function () {
      user.setAge(18);
      assertEquals(user.getAge(), 18);
    });
  });
Deno.test("User age", async (t) => {
  const user = new User("Kyle");

  await t.step("getAge", () => {
    assertThrows(() => user.getAge(), Error, "Age unknown");
    user.age = 18;
    assertEquals(user.getAge(), 18);
  });

  await t.step("setAge", () => {
    user.setAge(18);
    assertEquals(user.getAge(), 18);
  });
});

後者はageのテストが終わった時にUserがclearされてなくて環境が汚れちゃうのでは?

iharuyaiharuya
  • フィルタリングしたいなら、副作用生まないように頑張ってDeno.test()を使う
  • BDDを選択するなら、itレベルでのフィルタリングはできない