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
equalityCheck
yöntemini geçersiz kılmak içinSnapshotClient
'ı genişletmenize gerek yok: sadece bir örnek oluştururkenisEqual
parametresi olarak geçirin. client.setTest
adıclient.startCurrentRun
olarak değiştirildi.client.resetCurrent
adıclient.finishCurrentRun
olarak 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.
--threads
artık--pool=threads
--no-threads
artık--pool=forks
--single-thread
artık--poolOptions.threads.singleThread
--experimental-vm-threads
artık--pool=vmThreads
--experimental-vm-worker-memory-limit
artık--poolOptions.vmThreads.memoryLimit
--isolate
artık--poolOptions.<pool-name>.isolate
vebrowser.isolate
test.maxThreads
artıktest.poolOptions.<pool-name>.maxThreads
test.minThreads
artıktest.poolOptions.<pool-name>.minThreads
test.useAtomics
artıktest.poolOptions.<pool-name>.useAtomics
test.poolMatchGlobs.child_process
artıktest.poolMatchGlobs.forks
test.poolMatchGlobs.experimentalVmThreads
artı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) => { // [!code --]
it('should work', () => new Promise(done => { // [!code ++]
// ...
done()
}) // [!code --]
})) // [!code ++]
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.