назад до уроку

Що не так з цим тестом?

важливість: 5

Що не так з тестом функціій pow, вказаним нижче?

it("Підносить x до n-нного степеня", function() {
  let x = 5;

  let result = x;
  assert.equal(pow(x, 1), result);

  result *= x;
  assert.equal(pow(x, 2), result);

  result *= x;
  assert.equal(pow(x, 3), result);
});

P.S. Синтаксичних помилок не має і тести проходять.

Тест демонструє одну із спокус, з якою стикається розробник, коли пише тести.

Що ми маємо тут, це насправді 3 тести, але вони були описані однією функцією з 3 припущеннями.

Іноді простіше написати таким чином, але якщо трапляється помилка, стає не очевидно, що пішло не так.

Якщо помилка трапляється посеред складного потоку виконання, то нам доведеться з’ясувати які були дані на той момент. Тобто, нам доведеться налагоджувати тест.

Було б набагато краще розбити тест на кілька блоків it із чітко прописаними вхідними даними та результатами.

Наприклад:

describe("Підносить до n-нного степеня", function() {
  it("5 піднесене до степеня 1 дорівнює 5", function() {
    assert.equal(pow(5, 1), 5);
  });

  it("5 піднесене до степеня 2 дорівнює 25", function() {
    assert.equal(pow(5, 2), 25);
  });

  it("5 піднесене до степеня 3 дорівнює 125", function() {
    assert.equal(pow(5, 3), 125);
  });
});

Ми замінили один блок it на describe і групу блоків it. Тепер, якщо виникає помилка, ми чітко бачимо, з якими даними вона виникає.

Також ми можемо виділити один тест і запустити його в автономному режимі, написавши it.only замістьit:

describe("Підносить x до n-нного степеня", function() {
  it("5 піднесене до степеня 1 дорівнює 5", function() {
    assert.equal(pow(5, 1), 5);
  });

  // Mocha запустить лише цей блок
  it.only("5 піднесене до степеня 2 дорівнює 25", function() {
    assert.equal(pow(5, 2), 25);
  });

  it("5 піднесене до степеня 3 дорівнює 125", function() {
    assert.equal(pow(5, 3), 125);
  });
});