Geçiş Rehberi
Vitest 0.34.6'dan Geçiş
Minimum Gereksinimler
Vitest 1.0, Vite 5.0 ve Node.js 18 veya daha üstünü gerektirir.
Tüm @vitest/* alt paketleri, Vitest sürüm 1.0'ı gerektirir.
Anlık Görüntü Güncellemesi #3961
Anlık görüntülerdeki tırnak işaretleri artık escape edilmiyor ve tüm anlık görüntüler, dize tek satır olsa bile ters tırnak (`) kullanıyor.
- Tırnak işaretleri artık escape edilmiyor:
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
- \\"foo\\": \\"bar\\",
+ "foo": "bar",
}
`)- Tek satırlık anlık görüntülerde artık "'" yerine "`" tırnak işaretleri kullanılıyor:
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)Ayrıca @vitest/snapshot paketinde de değişiklikler yapıldı. Doğrudan kullanmıyorsanız, herhangi bir değişiklik yapmanız gerekmez.
- Artık
equalityCheckyöntemini geçersiz kılmak içinSnapshotClient'ı genişletmenize gerek yok: sadece bir örnek oluştururkenisEqualparametresi olarak geçirin. client.setTestadıclient.startCurrentRunolarak değiştirildi.client.resetCurrentadıclient.finishCurrentRunolarak değiştirildi.
Havuzlar Standartlaştırıldı #4172
Test çalıştırıcısını ihtiyaçlarınıza göre yapılandırmayı kolaylaştırmak için yapılandırma seçeneklerini azalttık. --threads veya diğer ilgili işaretlere güveniyorsanız, lütfen geçiş örneklerine göz atın.
--threadsartık--pool=threads--no-threadsartık--pool=forks--single-threadartık--poolOptions.threads.singleThread--experimental-vm-threadsartık--pool=vmThreads--experimental-vm-worker-memory-limitartık--poolOptions.vmThreads.memoryLimit--isolateartık--poolOptions.<pool-name>.isolatevebrowser.isolatetest.maxThreadsartıktest.poolOptions.<pool-name>.maxThreadstest.minThreadsartıktest.poolOptions.<pool-name>.minThreadstest.useAtomicsartıktest.poolOptions.<pool-name>.useAtomicstest.poolMatchGlobs.child_processartıktest.poolMatchGlobs.forkstest.poolMatchGlobs.experimentalVmThreadsartıktest.poolMatchGlobs.vmThreads
{
scripts: {
- "test": "vitest --no-threads"
// Aynı davranış için:
+ "test": "vitest --pool forks --poolOptions.forks.singleFork"
// Veya çoklu paralel çatallar:
+ "test": "vitest --pool forks"
}
}{
scripts: {
- "test": "vitest --experimental-vm-threads"
+ "test": "vitest --pool vmThreads"
}
}{
scripts: {
- "test": "vitest --isolate false"
+ "test": "vitest --poolOptions.threads.isolate false"
}
}{
scripts: {
- "test": "vitest --no-threads --isolate false"
+ "test": "vitest --pool forks --poolOptions.forks.isolate false"
}
}Kapsamda Değişiklikler #4265, #4442
coverage.all seçeneği artık varsayılan olarak etkindir. Bu, coverage.include deseniyle eşleşen tüm proje dosyalarının, çalıştırılmasalar bile kapsama dahil edileceği anlamına gelir.
Kapsam eşikleri API'sinin yapısı değiştirildi ve artık glob desenlerini kullanarak belirli dosyalar için eşikler belirtmeyi destekliyor:
export default defineConfig({
test: {
coverage: {
- perFile: true,
- thresholdAutoUpdate: true,
- 100: true,
- lines: 100,
- functions: 100,
- branches: 100,
- statements: 100,
+ thresholds: {
+ perFile: true,
+ autoUpdate: true,
+ 100: true,
+ lines: 100,
+ functions: 100,
+ branches: 100,
+ statements: 100,
+ }
}
}
})Mock Tipleri #4400
Jest tarzı 'Mock' isimlendirmesi lehine bazı tipler kaldırıldı.
- import { EnhancedSpy, SpyInstance } from 'vitest'
+ import { MockInstance } from 'vitest'WARNING
SpyInstance kullanımdan kaldırılmıştır, yerine MockInstance kullanılacaktır ve bir sonraki ana sürümde kaldırılacaktır.
Zamanlayıcı Mock'ları #3925
vi.useFakeTimers(), artık process.nextTick'i otomatik olarak sahte zamanlayıcılarla değiştirmiyor. vi.useFakeTimers({ toFake: ['nextTick'] }) kullanarak açıkça belirterek process.nextTick'i taklit etmek hala mümkündür.
Ancak, --pool=forks kullanıldığında process.nextTick'i taklit etmek mümkün değildir. process.nextTick'i taklit etmeniz gerekiyorsa farklı bir --pool seçeneği kullanın.
Jest'ten Geçiş
Vitest, Jest'ten geçişi olabildiğince basit hale getirmek için Jest uyumlu bir API ile tasarlanmıştır. Bu çabalara rağmen, aşağıdaki farklılıklarla karşılaşabilirsiniz:
Varsayılan olarak Globaller
Jest'te globals API varsayılan olarak etkindir, Vitest'te ise böyle değildir. The globals yapılandırma ayarı aracılığıyla global'leri etkinleştirebilir veya bunun yerine vitest modülünden içe aktarmaları kullanmak için kodunuzu güncelleyebilirsiniz.
Global'leri devre dışı bırakmaya karar verirseniz, testing-library gibi yaygın kitaplıkların otomatik DOM cleanup yapmayacağını unutmayın.
Modül Mock'ları
Jest'te bir modülü mock'larken, fabrika fonksiyonunun dönüş değeri varsayılan export'tur. Vitest'te, fabrika argümanı her dışa aktarımı açıkça tanımlanmış bir nesne döndürmelidir. Örneğin, aşağıdaki jest.mock'un aşağıdaki gibi güncellenmesi gerekir:
jest.mock('./some-path', () => 'hello');
vi.mock('./some-path', () => ({
default: 'hello',
})); Daha fazla ayrıntı için lütfen vi.mock api bölümüne bakın.
Otomatik Mock'lama Davranışı
Jest'ten farklı olarak, <root>/__mocks__ içindeki mock'lanmış modüller, vi.mock() çağrılmadığı sürece etkinleştirilmez. Jest'te olduğu gibi her testte mock'lanmaları gerekiyorsa, bunları setupFiles içinde mock'layabilirsiniz.
Mock'lanmış Bir Paketin Orijinalini İçe Aktarma
Bir paketi yalnızca kısmen mock'luyorsanız, daha önce Jest'in requireActual işlevini kullanmış olabilirsiniz. Vitest'te, bu çağrıları vi.importActual ile değiştirmelisiniz.
const { cloneDeep } = jest.requireActual('lodash/cloneDeep');
const { cloneDeep } = await vi.importActual('lodash/cloneDeep'); Mock'lamayı Harici Kitaplıklara Uygulama
Jest'te bu varsayılan olarak yapılır. Ancak Vitest'te, bir modülü mock'larken ve bu mock'lamanın aynı modülü kullanan diğer harici kitaplıklara uygulanmasını istiyorsanız, hangi 3. taraf kitaplığının mock'lanmasını istediğinizi açıkça belirtmelisiniz. Bu sayede harici kitaplık server.deps.inline kullanılarak kaynak kodunuzun bir parçası olur.
server.deps.inline: ["lib-name"]Mock'lanmış Bir Promise'in Dönüş Değerlerine Erişme
Hem Jest hem de Vitest, tüm mock çağrılarının sonuçlarını mock.results dizisinde saklar; burada her çağrının dönüş değerleri value özelliğinde saklanır. Ancak, bir promise'i mock'larken veya gözetlerken (örneğin mockResolvedValue kullanarak), Jest'te value özelliği bir promise dönerken, Vitest'te promise çözüldüğünde çözülmüş değeri döner.
await expect(spy.mock.results[0].value).resolves.toBe(123);
expect(spy.mock.results[0].value).toBe(123); Ortam Değişkenleri (Envs)
Tıpkı Jest gibi, Vitest de daha önce ayarlanmamışsa NODE_ENV'yi test olarak ayarlar. Vitest'te JEST_WORKER_ID'nin karşılığı olarak VITEST_POOL_ID (her zaman maxThreads'den küçük veya ona eşit) bulunur. Eğer JEST_WORKER_ID'ye güveniyorsanız, bunu VITEST_POOL_ID olarak yeniden adlandırmayı unutmayın. Vitest ayrıca, çalışan bir işçinin benzersiz bir kimliği olan VITEST_WORKER_ID'yi de kullanıma sunar - bu sayı maxThreads'den etkilenmez ve oluşturulan her işçiyle birlikte artar.
Özelliği Değiştirme (Replace property)
Nesneyi değiştirmek istiyorsanız, Jest'te replaceProperty API kullanırsınız. Vitest'te ise aynı işlevi vi.stubEnv veya vi.spyOn ile gerçekleştirebilirsiniz.
Bitti Geri Çağrısı (Done Callback)
Vitest v0.10.0'dan itibaren, test tanımlamada callback stili kullanımdan kaldırılmıştır. Bunları async/await işlevlerini kullanmak veya geri çağrı stilini taklit etmek için Promise kullanmak üzere yeniden yazabilirsiniz.
it('should work', (done) => {
it('should work', () => new Promise(done => {
// ...
done()
})
})) Kancalar (Hooks)
beforeAll/beforeEach kancaları Vitest'te temizlik fonksiyonu döndürebilir. Bu nedenle, undefined veya null dışında bir şey döndürürlerse, kancalarınızı yeniden düzenlemeniz gerekebilir:
beforeEach(() => setActivePinia(createTestingPinia()));
beforeEach(() => { setActivePinia(createTestingPinia()) }); Jest'te kancalar sıralı olarak (birbiri ardına) çağrılır. Varsayılan olarak, Vitest kancaları paralel olarak çalıştırır. Jest'in davranışını kullanmak için sequence.hooks seçeneğini güncelleyin:
export default defineConfig({
test: {
sequence: {
hooks: 'list',
},
},
});Tipler (Types)
Vitest'te jest ad alanı bulunmamaktadır, bu nedenle tipleri doğrudan vitest'ten içe aktarmanız gerekir:
let fn: jest.Mock<string, [string]>;
import type { Mock } from 'vitest';
let fn: Mock<[string], string>; Ayrıca, Vitest'te diff'te görebileceğiniz gibi Returns yerine ilk argüman olarak Args tipi vardır.
Zamanlayıcılar (Timers)
Vitest, Jest'in eski zamanlayıcılarını desteklemez.
Zaman Aşımı (Timeout)
jest.setTimeout kullandıysanız, vi.setConfig'e geçmeniz gerekir:
jest.setTimeout(5_000);
vi.setConfig({ testTimeout: 5_000 }); Vue Anlık Görüntüleri (Vue Snapshots)
Bu, Jest'e özgü bir özellik değildir, ancak daha önce Jest'i vue-cli ön ayarıyla kullanıyorsanız, jest-serializer-vue paketini yüklemeniz ve setupFiles içinde kullanmanız gerekir:
vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
test: {
setupFiles: ['./tests/unit/setup.js'],
},
});tests/unit/setup.js
import vueSnapshotSerializer from 'jest-serializer-vue';
expect.addSnapshotSerializer(vueSnapshotSerializer);Aksi takdirde, anlık görüntülerinizde çok sayıda escape edilmiş " karakteri olacaktır.