Geçiş Kılavuzu
Vitest 2.0'a Geçiş
Varsayılan Havuz forks
Vitest 2.0, daha iyi kararlılık için pool varsayılan yapılandırmasını 'forks' olarak değiştirir. Tam motivasyonu PR adresinde bulabilirsiniz.
pool belirtmeden poolOptions kullandıysanız, yapılandırmayı güncellemeniz gerekebilir:
export default defineConfig({
test: {
poolOptions: {
threads: {
singleThread: true,
},
forks: {
singleFork: true,
},
}
}
});Kancalar Yığın İçinde Çalışıyor
Vitest 2.0'dan önce tüm kancalar paralel çalışıyordu. Vitest 2.0'da ise tüm kancalar seri olarak çalışır. Ek olarak, afterAll/afterEach kancaları ters sırada çalışır.
Kancaların paralel yürütülmesine geri dönmek için sequence.hooks değerini 'parallel' olarak değiştirin:
export default defineConfig({
test: {
sequence: {
hooks: 'parallel',
},
},
});suite.concurrent Tüm Testleri Eşzamanlı Çalıştırır
Daha önce, bir pakette concurrent belirtmek, eşzamanlı testleri paketlere göre gruplandırır ve sırayla çalıştırırdı. Şimdi, Jest'in davranışını takiben, tüm testler eşzamanlı olarak çalışır (maxConcurrency limitlerine tabi olarak).
V8 Kapsamının coverage.ignoreEmptyLines Varsayılan Olarak Etkin
coverage.ignoreEmptyLines varsayılan değeri artık true'dur. Bu önemli değişiklik, kod kapsamı raporlarını etkileyebilir ve bazı projeler için kapsam eşiklerinin ayarlanmasını gerektirebilir. Bu ayarlama yalnızca coverage.provider 'v8' olduğunda varsayılan ayarı etkiler.
watchExclude Seçeneğinin Kaldırılması
Vitest, Vite'ın izleyicisini kullanır. Dosyaları veya dizinleri server.watch.ignored'a ekleyerek hariç tutun:
export default defineConfig({
server: {
watch: {
ignored: ['!node_modules/examplejs']
}
}
});--segfault-retry Kaldırıldı
Varsayılan havuzdaki değişikliklerle birlikte, bu seçeneğe artık ihtiyaç duyulmamaktadır. Segfault hataları yaşıyorsanız, 'forks' havuzuna geçmeyi deneyin. Sorun devam ederse, lütfen yeniden üretilebilir bir örnekle yeni bir sorun açın.
Test Gruplarındaki Boş Görev Kaldırıldı
Bu, gelişmiş görev API'sında yapılan bir değişikliktir. Daha önce, .suite üzerinde gezinmek, bir dosya görevi yerine kullanılan boş dahili pakete yönlendirirdi.
Bu, .suite'i isteğe bağlı hale getirir; görev en üst düzeyde tanımlanmışsa, bir paketi bulunmayacaktır. Artık tüm görevlerde (dosya görevinin kendisi dahil, bu yüzden sonsuz özyinelemeye düşmemeye dikkat edin) bulunan .file özelliğini kullanabilirsiniz.
Bu değişiklik, expect.getState().currentTestName'den dosyayı kaldırır ve expect.getState().testPath'i zorunlu hale getirir.
task.meta JSON Raporlayıcıya Eklendi
JSON raporlayıcı artık her onay sonucunda task.meta'yı yazdırır.
Mock Fonksiyonlarının Basitleştirilmiş Generic Türleri (örn. vi.fn<T>, Mock<T>)
Daha önce vi.fn<TArgs, TReturn>, argümanlar ve dönüş değeri için ayrı ayrı iki genel türü kabul ediyordu. Bu, kullanımı basitleştirmek için doğrudan bir fonksiyon türü vi.fn<T> kabul edecek şekilde değiştirildi.
import { type Mock, vi } from 'vitest';
const add = (x: number, y: number): number => x + y;
// vi.fn<T> kullanılıyor
const mockAdd = vi.fn<Parameters<typeof add>, ReturnType<typeof add>>();
const mockAdd = vi.fn<typeof add>();
// Mock<T> kullanılıyor
const mockAdd: Mock<Parameters<typeof add>, ReturnType<typeof add>> = vi.fn();
const mockAdd: Mock<typeof add> = vi.fn(); Çözülmüş mock.results'a Erişme
Daha önce Vitest, fonksiyon bir Promise döndürdüyse mock.results değerlerini çözümlüyordu. Artık, döndürülen Promise yalnızca çözümlendiğinde veya reddedildiğinde doldurulan ayrı bir mock.settledResults özelliği mevcuttur.
const fn = vi.fn().mockResolvedValueOnce('result');
await fn();
const result = fn.mock.results[0]; // 'result'
const result = fn.mock.results[0]; // 'Promise<result>'
const settledResult = fn.mock.settledResults[0]; // 'result'Bu değişiklikle birlikte, daha önce toHaveReturned kullandıysanız geçişi kolaylaştırmak için toHaveReturned'a benzer yeni toHaveResolved* eşleştiricileri de tanıtıyoruz:
const fn = vi.fn().mockResolvedValueOnce('result');
await fn();
expect(fn).toHaveReturned('result');
expect(fn).toHaveResolved('result'); Tarayıcı Modu
Vitest Tarayıcı Modu, beta döngüsü boyunca birçok değişikliğe uğradı. Tarayıcı Modu hakkındaki felsefemizi GitHub tartışma sayfasında bulabilirsiniz.
Değişikliklerin çoğu eklemeydi, ancak bazı küçük kırılma değişiklikleri de vardı:
nonesağlayıcısıpreviewolarak yeniden adlandırıldı #5842previewsağlayıcısı artık varsayılan #5842indexScriptsorchestratorScriptsolarak yeniden adlandırıldı #5842
Kullanımdan Kaldırılan Seçenekler Kaldırıldı
Bazı kullanımdan kaldırılan seçenekler kaldırıldı:
vitest typecheckkomutu - bunun yerinevitest --typecheckkullanılmalıdırVITEST_JUNIT_CLASSNAMEveVITEST_JUNIT_SUITE_NAMEortam değişkenleri (bunun yerine raporlayıcı seçenekleri kullanılmalıdır)c8kapsamı kontrolü (bunun yerine coverage-v8 kullanılmalıdır)vitest'tenSnapshotEnvironmentdışa aktarımı - bunun yerinevitest/snapshot'tan içe aktarılmalıdırSpyInstance,MockInstancelehine kaldırıldı
Vitest 1.0'a Geçiş
Minimum Gereksinimler
Vitest 1.0, Vite 5.0 ve Node.js 18 veya daha yüksek bir sürüm gerektirir.
Tüm @vitest/* alt paketleri Vitest sürüm 1.0 gerektirir.
Snapshot Güncellemesi #3961
Anlık görüntülerdeki tırnak işaretleri artık kaçış karakteriyle gösterilmiyor ve tüm anlık görüntüler, dize tek bir satır olsa bile ters tırnak işaretleri (`) kullanır.
- Tırnak işaretleri artık kaçış karakteriyle gösterilmiyor:
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
- \\"foo\\": \\"bar\\",
+ "foo": "bar",
}
`)- Tek satırlık anlık görüntüler artık '"' tırnak işaretleri yerine "`" tırnak işaretleri kullanıyor:
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)Ayrıca @vitest/snapshot paketinde değişiklikler yapıldı. Doğrudan kullanmıyorsanız, herhangi bir şeyi değiştirmenize gerek yoktur.
- Artık sadece
equalityCheckyöntemini geçersiz kılmak içinSnapshotClient'ı genişletmenize gerek yok: sadece bir örneği başlatırkenisEqualolarak geçirin client.setTestclient.startCurrentRunolarak yeniden adlandırıldıclient.resetCurrentclient.finishCurrentRunolarak yeniden adlandırıldı
Havuzlar Standartlaştırıldı #4172
Çalıştırıcıyı ihtiyaçlarınıza göre yapılandırmayı kolaylaştırmak için birçok yapılandırma seçeneği kaldırılmıştır. --threads veya diğer ilgili bayraklara güveniyorsanız, lütfen geçiş örneklerine bir 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"
}
}Kapsamdaki Değişiklikler #4265, #4442
coverage.all seçeneği artık varsayılan olarak etkindir. Bu, coverage.include desenine uyan tüm proje dosyalarının yürütülmeseler bile işleneceği anlamına gelmektedir.
Kapsam eşikleri API'sinin şekli değiştirildi ve artık glob desenleri kullanarak belirli dosyalar için eşiklerin belirtilmesini 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 Türleri #4400
Jest tarzı "Mock" adlandırması lehine birkaç tür kaldırıldı.
- import { EnhancedSpy, SpyInstance } from 'vitest'
+ import { MockInstance } from 'vitest'WARNING
SpyInstance, MockInstance lehine kullanımdan kaldırılmıştı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 taklit etmiyor. process.nextTick'i açıkça vi.useFakeTimers({ toFake: ['nextTick'] }) kullanarak taklit etmek hala mümkündür.
Ancak, --pool=forks kullanırken process.nextTick taklit etmek mümkün değildir. process.nextTick taklit etmeye ihtiyacınız varsa farklı bir --pool seçeneği kullanın.
Jest'ten Geçiş
Vitest, Jest'ten geçişi mümkün olduğunca basitleştirmek amacıyla Jest uyumlu bir API ile tasarlanmıştır. Bu çabalara rağmen, yine de aşağıdaki farklılıklarla karşılaşabilirsiniz:
Globals Varsayılan Değil
Jest, globals API'sini varsayılan olarak etkinleştirir. Vitest ise bunu yapmaz. Ya globals yapılandırma ayarı aracılığıyla globals'ı etkinleştirebilir ya da kodunuzu vitest modülünden içe aktarmaları kullanacak şekilde güncelleyebilirsiniz.
Globals'ı devre dışı bırakmaya karar verirseniz, testing-library gibi yaygın kütüphanelerin otomatik DOM temizliğini çalıştırmayacağını unutmayın.
Modül Mock'ları
Jest'te bir modülü taklit ederken, fabrika argümanının dönüş değeri varsayılan dışa aktarımdır. Vitest'te, fabrika argümanı, her dışa aktarımın açıkça tanımlandığı 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 Davranışı
Jest'in aksine, <root>/__mocks__ içindeki taklit edilmiş modüller, vi.mock() çağrılmadıkça yüklenmez. Jest'teki gibi her testte taklit edilmelerini istiyorsanız, bunları setupFiles içinde taklit edebilirsiniz.
Mock'lanmış Paketin Orijinalini İçe Aktarma
Bir paketi yalnızca kısmen taklit ediyorsanı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'ları Harici Kütüphanelere Genişletme
Jest'in varsayılan olarak yaptığı gibi, bir modülü taklit ederken ve bu taklidin aynı modülü kullanan diğer harici kütüphanelere genişletilmesini istediğinizde, hangi üçüncü taraf kütüphanenin taklit edilmesini istediğinizi açıkça belirtmelisiniz. Böylece, harici kütüphane kaynak kodunuzun bir parçası olur. Bunu server.deps.inline kullanarak yapabilirsiniz.
server.deps.inline: ["lib-name"]expect.getState().currentTestName
Vitest'in test adları, testleri paketlerden ayırmayı kolaylaştırmak için > sembolüyle birleştirilirken, Jest boşluk () kullanır.
- `${describeTitle} ${testTitle}`
+ `${describeTitle} > ${testTitle}`Ortam Değişkenleri
Jest gibi, Vitest de daha önce ayarlanmamışsa NODE_ENV'i test olarak ayarlar. Vitest ayrıca JEST_WORKER_ID için VITEST_POOL_ID (her zaman maxThreads'a eşit veya daha az) adında bir karşılığa sahiptir, bu yüzden buna güveniyorsanız, yeniden adlandırmayı unutmayın. Vitest ayrıca çalışan bir işçinin benzersiz kimliği olan VITEST_WORKER_ID'yi de gösterir - bu sayı maxThreads'tan etkilenmez ve oluşturulan her işçiyle birlikte artacaktır.
ReplaceProperty Özelliği
Nesneyi değiştirmek isterseniz, Jest'te replaceProperty API'sini kullanırsınız. Vitest'te de aynısını yapmak için vi.stubEnv veya vi.spyOn kullanabilirsiniz.
Done Callback
Vitest v0.10.0'dan itibaren, testleri bildirme geri çağırma stili kullanımdan kaldırılmıştır. Bunları async/await işlevlerini kullanacak şekilde yeniden yazabilir veya geri çağırma stilini taklit etmek için Promise kullanabilirsiniz.
it('should work', (done) => {
it('should work', () => new Promise(done => {
// ...
done()
})
})) Kancalar
beforeAll/beforeEach kancaları Vitest'te kaldırma işlevi döndürebilir. Bu nedenle, undefined veya null dışında bir şey döndürüyorlarsa kanca bildirimlerinizi yeniden yazmanız gerekebilir:
beforeEach(() => setActivePinia(createTestingPinia()));
beforeEach(() => { setActivePinia(createTestingPinia()) }); Jest'te kancalar sırayla (birbiri ardına) çağrılır. Varsayılan olarak, Vitest kancaları paralel ç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',
}
}
});Türler
Vitest'in jest ad alanına eşdeğeri yoktur, bu nedenle türleri doğrudan vitest'ten içe aktarmanız gerekecektir:
let fn: jest.Mock<(name: string) => number>;
import type { Mock } from 'vitest';
let fn: Mock<(name: string) => number>; Zamanlayıcılar
Vitest, Jest'in eski zamanlayıcılarını desteklemez.
Zaman Aşımı
jest.setTimeout kullandıysanız, vi.setConfig'e geçmeniz gerekir:
jest.setTimeout(5_000);
vi.setConfig({ testTimeout: 5_000 }); Vue Snapshot'ları
Bu Jest'e özgü bir özellik değildir, ancak daha önce Jest'i vue-cli ön ayarıyla kullandıysanız, jest-serializer-vue paketini yüklemeniz ve bunu setupFiles içinde kullanmanız gerekecektir:
import { defineConfig } from 'vite';
export default defineConfig({
test: {
setupFiles: ['./tests/unit/setup.js'],
},
});import vueSnapshotSerializer from 'jest-serializer-vue';
expect.addSnapshotSerializer(vueSnapshotSerializer);Aksi takdirde anlık görüntülerinizde çok sayıda kaçış karakteri " olacaktır.