Geçiş Kılavuzu
Vitest 3.0'a Geçiş
Test Seçeneklerinin Üçüncü Argüman Olarak Kullanımı
Vitest 3.0'da, test veya describe fonksiyonlarına üçüncü argüman olarak bir nesne geçirilmesi durumunda bir uyarı verilir:
test('validation works', () => {
// ...
}, { retry: 3 });
test('validation works', { retry: 3 }, () => {
// ...
});Bir sonraki ana sürümde, üçüncü argüman bir nesne olduğunda bir hata fırlatılacaktır. Zaman aşımı süresinin hala geçerli bir üçüncü argüman olduğunu unutmayın:
test('validation works', () => {
// ...
}, 1000); // Ok ✅browser.name ve browser.providerOptions Kullanımdan Kaldırıldı
Hem browser.name hem de browser.providerOptions Vitest 4'te kaldırılacaktır. Bunların yerine yeni browser.instances seçeneğini kullanın:
export default defineConfig({
test: {
browser: {
name: 'chromium',
providerOptions: {
launch: { devtools: true },
},
instances: [
{
browser: 'chromium',
launch: { devtools: true },
},
],
},
},
})Yeni browser.instances özelliği ile birden fazla tarayıcı yapılandırması da belirtebilirsiniz.
spy.mockReset Artık Orijinal Uygulamayı Geri Yüklüyor
Daha önce, bir spy'ı yeniden uygulamadan orijinal uygulamasına sıfırlamak için uygun bir yöntem yoktu. Artık spy.mockReset, uygulama fonksiyonunu sahte bir noop yerine orijinaline sıfırlar.
const foo = {
bar: () => 'Hello, world!',
};
vi.spyOn(foo, 'bar').mockImplementation(() => 'Hello, mock!');
foo.bar(); // 'Hello, mock!'
foo.bar.mockReset();
foo.bar(); // undefined
foo.bar(); // 'Hello, world!'vi.spyOn Metot Zaten Mock'lanmışsa Mock'u Yeniden Kullanır
Daha önce Vitest, bir nesne üzerinde gözetleme yaparken her zaman yeni bir spy ataması yapardı. Bu durum, mockRestore ile hatalara yol açıyordu çünkü spy'ı orijinal fonksiyon yerine önceki spy'a geri yüklüyordu:
vi.spyOn(fooService, 'foo').mockImplementation(() => 'bar');
vi.spyOn(fooService, 'foo').mockImplementation(() => 'bar');
vi.restoreAllMocks();
vi.isMockFunction(fooService.foo); // true
vi.isMockFunction(fooService.foo); // falseSahte Zamanlayıcı Varsayılanları
Vitest artık varsayılan fakeTimers.toFake seçeneklerini sunmamaktadır. Bunun yerine, Vitest mevcutsa ( nextTick hariç) zamanlayıcıyla ilgili herhangi bir API'yi mock'lar. Bu, vi.useFakeTimers çağrıldığında performance.now()'un artık mock'landığı anlamına gelir.
vi.useFakeTimers();
performance.now(); // original
performance.now(); // fakevi.useFakeTimers çağrılırken veya yapılandırmada global olarak zamanlayıcıları belirterek önceki davranışa geri dönebilirsiniz:
export default defineConfig({
test: {
fakeTimers: {
toFake: [
'setTimeout',
'clearTimeout',
'setInterval',
'clearInterval',
'setImmediate',
'clearImmediate',
'Date',
]
},
},
})Daha Sıkı Hata Eşitliği
Vitest artık toEqual veya toThrowError kullanarak hataları karşılaştırırken daha fazla özelliği kontrol eder. Vitest artık name, message, cause ve AggregateError.errors özelliklerini karşılaştırıyor. Error.cause için karşılaştırma asimetrik olarak gerçekleştirilir:
expect(new Error('hi', { cause: 'x' })).toEqual(new Error('hi')); // ✅
expect(new Error('hi')).toEqual(new Error('hi', { cause: 'x' })); // ❌Daha fazla özellik kontrolüne ek olarak Vitest, artık hata prototiplerini de karşılaştırır. Örneğin, bir TypeError fırlatıldıysa, eşitlik kontrolü Error yerine TypeError'a başvurmalıdır:
expect(() => {
throw new TypeError('type error');
})
.toThrowError(new Error('type error'))
.toThrowError(new TypeError('type error')); Daha fazla ayrıntı için PR'ye bakın: #5876.
module koşullu dışa aktarımı Vite 6'da varsayılan olarak çözülmez
Vite 6, daha esnek resolve.conditions seçeneklerine olanak tanır ve Vitest, varsayılan olarak module koşullu dışa aktarımını hariç tutacak şekilde yapılandırılmıştır. Vite tarafındaki değişikliklerin ayrıntıları için Vite 6 geçiş kılavuzuna da göz atın.
Custom Türü Kullanımdan Kaldırıldı API
Custom türü artık Test türünün bir takma adıdır. Vitest'in 2.1 sürümünde genel türleri güncellediğini ve dışa aktarılan adları RunnerCustomCase ve RunnerTestCase olarak değiştirdiğini unutmayın:
import {
RunnerCustomCase,
RunnerTestCase,
} from 'vitest';getCurrentSuite().custom() kullanıyorsanız, döndürülen görevin type'ı artık 'test''e eşit olacaktır. Custom türü Vitest 4'te kaldırılacaktır.
WorkspaceSpec Türü Artık Kullanılmıyor API
Genel API'de bu tür daha önce özel sıralayıcılarda kullanılıyordu. Lütfen bunun yerine TestSpecification'a geçiş yapın.
onTestFinished ve onTestFailed Artık Bir Bağlam Alıyor
onTestFinished ve onTestFailed kancaları daha önce ilk argüman olarak bir test sonucu alıyordu. Artık beforeEach ve afterEach gibi bir test bağlamı alırlar.
Snapshot API'sındaki Değişiklikler API
@vitest/snapshot içindeki genel Snapshot API'si, tek bir çalıştırma içinde birden fazla durumu desteklemek amacıyla değiştirildi. Daha fazla ayrıntı için PR'ye bakın: #6817
Bu değişikliklerin yalnızca Snapshot API'sini doğrudan kullanan geliştiricileri etkilediğini unutmayın. .toMatchSnapshot API'sinde herhangi bir değişiklik yapılmamıştır.
resolveConfig Tür İmzasındaki Değişiklikler API
resolveConfig artık daha kullanışlıdır. Zaten çözülmüş Vite yapılandırmasını kabul etmek yerine, artık bir kullanıcı yapılandırmasını kabul eder ve çözülmüş yapılandırmayı döndürür.
Bu fonksiyon dahili olarak kullanılmaz ve yalnızca genel bir API olarak sunulur.
vitest/reporters türleri temizlendi API
vitest/reporters giriş noktası artık yalnızca raporlayıcı uygulamalarını ve seçenek türlerini dışa aktarır. TestCase/TestSuite ve diğer görevle ilgili türlere erişmeniz gerekiyorsa, bunları ayrıca vitest/node'dan içe aktarmanız gerekir.
Kapsam, coverage.excludes üzerine yazılsa bile test dosyalarını yoksayar.
Artık test dosyalarını coverage.excludes üzerine yazarak kapsam raporuna dahil etmek mümkün değildir. Test dosyaları artık her zaman hariç tutulur.
Vitest 2.0'a Geçiş
Varsayılan Havuz forks
Vitest 2.0, daha iyi kararlılık sağlamak amacıyla pool için varsayılan yapılandırmayı 'forks' olarak değiştirmiştir. Tam motivasyonu PR'de okuyabilirsiniz.
pool belirtmeden poolOptions kullandıysanız, yapılandırmayı güncellemeniz gerekebilir:
export default defineConfig({
test: {
poolOptions: {
threads: {
singleThread: true,
},
forks: {
singleFork: true,
},
}
}
})Kancalar Bir Yığında Çalışıyor
Vitest 2.0'dan önce tüm kancalar paralel olarak çalışıyordu. 2.0'da 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'u '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 bunları sırayla çalıştırırdı. Artık, Jest'in davranışını takiben, tüm testler eşzamanlı olarak çalışır ( maxConcurrency sınırlarına tabi olarak).
V8 Kapsamının coverage.ignoreEmptyLines Varsayılan Olarak Etkinleştirildi
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şiklerinde ayarlamalar 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 gerek yoktur. Segfault hataları yaşıyorsanız, 'forks' havuzuna geçmeyi deneyin. Sorun devam ederse, lütfen bir yeniden üretimle birlikte yeni bir sorun açın.
Paket Görevlerindeki 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 yol açardı.
Bu, .suite'i isteğe bağlı hale getirir; görev en üst düzeyde tanımlanmışsa, bir paketi olmayacaktır. Artık tüm görevlerde (dosya görevinin kendisi dahil, bu yüzden sonsuz özyinelemeye düşmemeye dikkat edin) bulunan .file özelliğine geri dönebilirsiniz.
Bu değişiklik ayrıca dosyayı expect.getState().currentTestName'den kaldırır ve expect.getState().testPath'i zorunlu kılar.
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ş Genel 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 { vi } from 'vitest';
import type { Mock } from 'vitest';
const add = (x: number, y: number): number => x + y;
// using vi.fn<T>
const mockAdd = vi.fn<Parameters<typeof add>, ReturnType<typeof add>>();
const mockAdd = vi.fn<typeof add>();
// using Mock<T>
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ürürse mock.results değerlerini çözüyordu. Artık, döndürülen Promise çözüldüğünde veya reddedildiğinde doldurulan ayrı bir mock.settledResults özelliği bulunmaktadır.
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 sunuyoruz:
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 okuyabilirsiniz.
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ın.VITEST_JUNIT_CLASSNAMEveVITEST_JUNIT_SUITE_NAMEortam değişkenleri (bunun yerine raporlayıcı seçeneklerini kullanın).c8kapsamı kontrolü (bunun yerine coverage-v8 kullanın).SnapshotEnvironment'ınvitest'ten dışa aktarımı - bunun yerinevitest/snapshot'tan içe aktarın.SpyInstance,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.
Anlık Görüntü 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 ':' yerine "`" tırnak işaretleri kullanıyor:
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)@vitest/snapshot paketinde de değişiklikler yapılmıştır. Doğrudan kullanmıyorsanız, herhangi bir şeyi değiştirmenize gerek yoktur.
equalityCheckmetodunu geçersiz kılmak için artıkSnapshotClient'ı genişletmenize gerek yoktur: bir örneği başlatırkenisEqualolarak geçmeniz yeterlidir.client.setTestclient.startCurrentRunolarak yeniden adlandırıldı.client.resetCurrentclient.finishCurrentRunolarak yeniden adlandırıldı.
Havuzlar Standartlaştırıldı #4172
Koşucuyu ihtiyaçlarınıza göre yapılandırmayı kolaylaştırmak için birçok yapılandırma seçeneğini kaldırdık. --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"
// For identical behaviour:
+ "test": "vitest --pool forks --poolOptions.forks.singleFork"
// Or multi parallel forks:
+ "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ülmese bile işleneceği anlamına gelir.
Kapsam eşikleri API'sinin şekli değiştirildi ve artık glob desenleri kullanarak belirli dosyalar için eşiklerin belirtilmesini destekler:
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 mock'lamaz. process.nextTick'i vi.useFakeTimers({ toFake: ['nextTick'] }) kullanarak açıkça belirterek mock'lamak hala mümkündür.
Ancak, --pool=forks kullanırken process.nextTick'i mock'lamak mümkün değildir. process.nextTick mock'lamasına ihtiyacınız varsa farklı bir --pool seçeneği kullanın.
Jest'ten Geçiş
Vitest, Jest ile uyumlu bir API ile tasarlanmıştır, bu da Jest'ten geçişi mümkün olduğunca basit hale getirmeyi amaçlar. Bu çabalara rağmen, yine de aşağıdaki farklılıklarla karşılaşabilirsiniz:
Varsayılan Olarak Globals
Jest'in globals API'si varsayılan olarak etkindir. Vitest'te ise değildir. 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 temizlemesini çalıştırmayacağını unutmayın.
spy.mockReset
Jest'in mockReset'i, mock uygulamasını undefined döndüren boş bir fonksiyonla değiştirir.
Vitest'in mockReset'i, mock uygulamasını orijinaline sıfırlar. Yani, vi.fn(impl) tarafından oluşturulan bir mock'u sıfırlamak, mock uygulamasını impl'e sıfırlar.
Modül Mock'ları
Jest'te bir modülü mock'larken, 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'lama Davranışı
Jest'in aksine, <root>/__mocks__ içindeki mock'lanmış modüller vi.mock() çağrılmadıkça yüklenmez. Jest'teki gibi her testte mock'lanmalarını istiyorsanız, 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 fonksiyonunu 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 kütüphanelere genişletme
Jest'in varsayılan olarak yaptığı gibi, bir modülü mock'larken ve bu mock'lamanın aynı modülü kullanan diğer harici kütüphanelere genişletilmesini istediğinizde, hangi üçüncü taraf kütüphanenin mock'lanmasını istediğinizi açıkça belirtmelisiniz. Böylece harici kütüphane, server.deps.inline kullanarak kaynak kodunuzun bir parçası olur.
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'ye karşılık gelen VITEST_POOL_ID'ye (her zaman maxThreads'a eşit veya daha az) 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 açığa çıkarır - bu sayı maxThreads'tan etkilenmez ve oluşturulan her işçiyle birlikte artar.
Özelliği Değiştir
Nesneyi değiştirmek isterseniz, Jest'te replaceProperty API kullanırsınız. Vitest'te de aynısını yapmak için vi.stubEnv veya vi.spyOn kullanabilirsiniz.
Done Geri Çağrısı
Vitest v0.10.0'dan itibaren, testleri bildirme geri çağırma stili kullanımdan kaldırılmıştır. Bunları async/await fonksiyonlarını 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 temizleme fonksiyonu 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 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',
}
}
})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 gerekecektir:
jest.setTimeout(5_000);
vi.setConfig({ testTimeout: 5_000 }); Vue Anlık Görüntüleri
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.