Skip to content
Vitest 2
Main Navigation KılavuzAPIYapılandırmaTarayıcı Moduİleri
2.1.9
1.6.1
0.34.6

Türkçe

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
čeština
magyar

Türkçe

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
čeština
magyar

Görünüm

Sidebar Navigation

Neden Vitest

Başlangıç

Özellikler

Çalışma Alanı

Komut Satırı Arayüzü

Test Filtreleme

Raporlayıcılar

Kapsam

Anlık Görüntü (Snapshot) Testleri

Sahtecilik (Mocking)

Türleri Test Etme

Vitest Arayüzü

Kaynak İçi Test

Test Bağlamı

Test Ortamı

Eşleştiricileri Genişletme

IDE Tümleştirmeleri

Hata Ayıklama

Diğer Test Çalıştırıcılarıyla Karşılaştırmalar

Geçiş Rehberi

Yaygın Hatalar

Profiling Test Performance

Performansı İyileştirme

Bu sayfada

Anlık Görüntü ​

Vue School'dan video ile Anlık Görüntü öğrenin

Anlık görüntü testleri, fonksiyonlarınızın çıktısının beklenmedik bir şekilde değişmediğinden emin olmak için oldukça kullanışlı bir araçtır.

Anlık görüntü kullanıldığında, Vitest verilen değerin bir anlık görüntüsünü alır ve bunu testin yanında depolanan bir referans anlık görüntü dosyasıyla karşılaştırır. İki anlık görüntü eşleşmezse test başarısız olur. Bu durumda, ya değişiklik beklenmedik bir durumdur ya da referans anlık görüntünün, sonucun yeni sürümüne göre güncellenmesi gerekir.

Anlık Görüntüleri Kullanma ​

Bir değeri anlık görüntülemek için expect() API'sinden toMatchSnapshot() kullanabilirsiniz:

ts
import { expect, it } from 'vitest';

it('toUpperCase', () => {
  const result = toUpperCase('foobar');
  expect(result).toMatchSnapshot();
});

Bu test ilk kez çalıştırıldığında, Vitest şöyle görünen bir anlık görüntü dosyası oluşturur:

js
// Vitest Snapshot v1, https://www.getbook.com/tr/book/vitest-1/guide/snapshot

exports['toUpperCase 1'] = '"FOOBAR"';

Anlık görüntü dosyası, kod değişiklikleriyle birlikte commit edilmeli ve kod inceleme sürecinizin bir parçası olarak gözden geçirilmelidir. Sonraki test çalıştırmalarında, Vitest oluşturulan çıktıyı önceki anlık görüntüyle karşılaştıracaktır. Eşleşirlerse test başarılı olur. Eşleşmezlerse, test çalıştırıcısı kodunuzda düzeltilmesi gereken bir hata bulmuş olabilir veya uygulama değiştiği için anlık görüntünün güncellenmesi gerekebilir.

WARNING

Asenkron testlerde Anlık Görüntüler kullanırken, doğru testin algılandığından emin olmak için yerel Test Bağlamı içindeki expect kullanılmalıdır.

Satır İçi Anlık Görüntüler ​

Benzer şekilde, anlık görüntüyü test dosyası içinde satır içi olarak depolamak için toMatchInlineSnapshot() kullanabilirsiniz.

ts
import { expect, it } from 'vitest';

it('toUpperCase', () => {
  const result = toUpperCase('foobar');
  expect(result).toMatchInlineSnapshot();
});

Bir anlık görüntü dosyası oluşturmak yerine, Vitest anlık görüntüyü bir dize olarak güncellemek için test dosyasını doğrudan değiştirecektir:

ts
import { expect, it } from 'vitest';

it('toUpperCase', () => {
  const result = toUpperCase('foobar');
  expect(result).toMatchInlineSnapshot('"FOOBAR"');
});

Bu, farklı dosyalar arasında geçiş yapmadan beklenen çıktıyı doğrudan görmenizi sağlar.

WARNING

Asenkron testlerde Anlık Görüntüler kullanırken, doğru testin algılandığından emin olmak için yerel Test Bağlamı içindeki expect kullanılmalıdır.

Anlık Görüntüleri Güncelleme ​

Alınan değer anlık görüntüyle eşleşmediğinde, test başarısız olur ve aralarındaki farkı gösterir. Anlık görüntü değişikliği bekleniyorsa, anlık görüntüyü mevcut durumdan güncellemek isteyebilirsiniz.

İzleme modunda, başarısız olan anlık görüntüyü doğrudan güncellemek için terminalde u tuşuna basabilirsiniz.

Veya Vitest'in anlık görüntüleri güncellemesini sağlamak için CLI'da --update veya -u bayrağını kullanabilirsiniz.

bash
vitest -u

Dosya Anlık Görüntüleri ​

toMatchSnapshot() çağrıldığında, tüm anlık görüntüleri biçimlendirilmiş bir anlık görüntü dosyasına kaydederiz. Bu, anlık görüntü dizesindeki bazı karakterleri (yani çift tırnak " ve ters tırnak `) kaçırmamız gerektiği anlamına gelir. Bu arada, anlık görüntü içeriği için sözdizimi vurgulamasını kaybedebilirsiniz (eğer bir dildeyse).

Bu nedenle, bir dosyayla açıkça eşleşmek için toMatchFileSnapshot() özelliğini tanıttık. Bu, anlık görüntü dosyasına istediğiniz dosya uzantısını atamanıza olanak tanır ve bu dosyaları daha okunabilir hale getirir.

ts
import { expect, it } from 'vitest';

it('render basic', async () => {
  const result = renderHTML(h('div', { class: 'foo' }));
  await expect(result).toMatchFileSnapshot('./test/basic.output.html');
});

Bu, ./test/basic.output.html dosyasının içeriğiyle karşılaştırılacaktır. Ve --update bayrağıyla geri yazılabilir.

Resim Anlık Görüntüleri ​

jest-image-snapshot kullanarak resimleri anlık görüntülemek de mümkündür.

bash
npm i -D jest-image-snapshot
ts
test('image snapshot', () => {
  expect(readFileSync('./test/stubs/input-image.png')).toMatchImageSnapshot();
});

Özel Serileştirici ​

Anlık görüntülerinizin nasıl serileştirileceğini değiştirmek için kendi mantığınızı ekleyebilirsiniz. Jest gibi, Vitest'in de yerleşik JavaScript türleri, HTML öğeleri, ImmutableJS ve React öğeleri için varsayılan serileştiricileri vardır.

expect.addSnapshotSerializer API'sini kullanarak açıkça özel serileştirici ekleyebilirsiniz.

ts
expect.addSnapshotSerializer({
  serialize(val, config, indentation, depth, refs, printer) {
    // `printer`, mevcut eklentileri kullanarak bir değeri serileştiren bir fonksiyondur.
    return `Pretty foo: ${printer(val.foo, config, indentation, depth, refs)}`;
  },
  test(val) {
    return val && Object.prototype.hasOwnProperty.call(val, 'foo');
  },
});

Ayrıca, özel serileştiricileri örtük olarak eklemek için snapshotSerializers seçeneğini de destekliyoruz.

ts
import { SnapshotSerializer } from 'vitest';

export default {
  serialize(val, config, indentation, depth, refs, printer) {
    // `printer`, mevcut eklentileri kullanarak bir değeri serileştiren bir fonksiyondur.
    return `Pretty foo: ${printer(val.foo, config, indentation, depth, refs)}`;
  },
  test(val) {
    return val && Object.prototype.hasOwnProperty.call(val, 'foo');
  },
} satisfies SnapshotSerializer;
ts
import { defineConfig } from 'vite';

export default defineConfig({
  test: {
    snapshotSerializers: ['path/to/custom-serializer.ts'],
  },
});

Şöyle bir test ekledikten sonra:

ts
test('foo snapshot test', () => {
  const bar = {
    foo: {
      x: 1,
      y: 2,
    },
  };

  expect(bar).toMatchSnapshot();
});

Aşağıdaki anlık görüntüyü alacaksınız:

Pretty foo: Object {
  "x": 1,
  "y": 2,
}

Anlık görüntüleri serileştirmek için Jest'in pretty-format kütüphanesini kullanıyoruz. Daha fazla bilgi için buraya bakabilirsiniz: pretty-format.

Jest'ten Farkı ​

Vitest, Jest'in Anlık Görüntü özelliğiyle neredeyse uyumlu bir özellik sunar, birkaç istisna dışında:

1. Anlık görüntü dosyasındaki yorum başlığı farklıdır {#_1-comment-header-in-the-snapshot-file-is-different} ​

diff
- // Jest Snapshot v1, https://goo.gl/fbAQLP
+ // Vitest Snapshot v1, https://www.getbook.com/tr/book/vitest-1/guide/snapshot

Bu, işlevselliği etkilemez; ancak Jest'ten geçiş yaparken commit farklılıklarını etkileyebilir.

2. printBasicPrototype varsayılan olarak false'tur {#_2-printbasicprototype-is-default-to-false} ​

Hem Jest hem de Vitest'in anlık görüntüleri pretty-format kütüphanesi tarafından desteklenmektedir. Vitest'te daha temiz bir anlık görüntü çıktısı elde etmek için printBasicPrototype varsayılan olarak false olarak ayarlanmıştır, Jest <29.0.0'da ise varsayılan olarak true'dur.

ts
import { expect, test } from 'vitest';

test('snapshot', () => {
  const bar = [
    {
      foo: 'bar',
    },
  ];

  // Jest'te
  expect(bar).toMatchInlineSnapshot(`
    Array [
      Object {
        "foo": "bar",
      },
    ]
  `);

  // Vitest'te
  expect(bar).toMatchInlineSnapshot(`
    [
      {
        "foo": "bar",
      },
    ]
  `);
});

Bunun okunabilirlik ve genel geliştirici deneyimi (DX) için daha mantıklı bir varsayılan olduğuna inanıyoruz. Hala Jest'in davranışını tercih ediyorsanız, yapılandırmanızı değiştirebilirsiniz:

ts
// vitest.config.js
export default defineConfig({
  test: {
    snapshotFormat: {
      printBasicPrototype: true,
    },
  },
});

3. Özel mesajlar için ayırıcı olarak iki nokta üst üste : yerine büyüktür işareti > kullanılır {#_3-chevron-is-used-as-a-separator-instead-of-colon-for-custom-messages} ​

Vitest, bir anlık görüntü dosyası oluşturulurken özel bir mesaj iletildiğinde okunabilirlik için iki nokta üst üste : yerine büyüktür işareti > kullanır.

Aşağıdaki örnek test kodu için:

js
test('toThrowErrorMatchingSnapshot', () => {
  expect(() => {
    throw new Error('error');
  }).toThrowErrorMatchingSnapshot('hint');
});

Jest'te anlık görüntü şöyle olacaktır:

console
exports[`toThrowErrorMatchingSnapshot: hint 1`] = `"error"`;

Vitest'te eşdeğer anlık görüntü şöyle olacaktır:

console
exports[`toThrowErrorMatchingSnapshot > hint 1`] = `[Error: error]`;

4. toThrowErrorMatchingSnapshot ve toThrowErrorMatchingInlineSnapshot için varsayılan Error anlık görüntüsü farklıdır {#_4-default-error-snapshot-is-different-for-tothrowerrormatchingsnapshot-and-tothrowerrormatchinginlinesnapshot} ​

js
import { expect, test } from 'vitest';

test('snapshot', () => {
  // Jest ve Vitest'te
  expect(new Error('error')).toMatchInlineSnapshot(`[Error: error]`);

  // Jest, `Error` örneği için `Error.message`'ı anlık görüntü olarak kaydeder
  // Vitest, toMatchInlineSnapshot ile aynı değeri gösterir
  expect(() => {
    throw new Error('error');
  }).toThrowErrorMatchingInlineSnapshot(`"error"`); 
  }).toThrowErrorMatchingInlineSnapshot(`[Error: error]`); 
});
Pager
Önceki sayfaKapsam
Sonraki sayfaSahtecilik (Mocking)

MIT Lisansı altında yayınlanmıştır.

Copyright (c) 2024 Mithril Contributors

https://v2.vitest.dev/guide/snapshot

MIT Lisansı altında yayınlanmıştır.

Copyright (c) 2024 Mithril Contributors