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ı:
none
sağlayıcısıpreview
olarak yeniden adlandırıldı #5842preview
sağlayıcısı artık varsayılan #5842indexScripts
orchestratorScripts
olarak 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 typecheck
komutu - bunun yerinevitest --typecheck
kullanılmalıdırVITEST_JUNIT_CLASSNAME
veVITEST_JUNIT_SUITE_NAME
ortam değişkenleri (bunun yerine raporlayıcı seçenekleri kullanılmalıdır)c8
kapsamı kontrolü (bunun yerine coverage-v8 kullanılmalıdır)vitest
'tenSnapshotEnvironment
dışa aktarımı - bunun yerinevitest/snapshot
'tan içe aktarılmalıdırSpyInstance
,MockInstance
lehine 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
equalityCheck
yöntemini geçersiz kılmak içinSnapshotClient
'ı genişletmenize gerek yok: sadece bir örneği başlatırkenisEqual
olarak geçirin client.setTest
client.startCurrentRun
olarak yeniden adlandırıldıclient.resetCurrent
client.finishCurrentRun
olarak 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.
--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"
}
}
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) => { // [!code --]
it('should work', () => new Promise(done => { // [!code ++]
// ...
done()
}) // [!code --]
})) // [!code ++]
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.