Test Ortamı
Vitest, kodunuzu belirli bir ortamda çalıştırmak için environment
seçeneğini sunar. Ortamın davranışını ise environmentOptions
seçeneğiyle özelleştirebilirsiniz.
Varsayılan olarak aşağıdaki ortamları kullanabilirsiniz:
node
: Varsayılan ortamdır.jsdom
: Tarayıcı API'lerini sağlayarak bir tarayıcı ortamını simüle eder vejsdom
paketini kullanır.happy-dom
: Tarayıcı API'lerini taklit ederek bir tarayıcı ortamı sağlar.jsdom
'dan daha hızlı olduğu kabul edilir ancak bazı API'lerden yoksundur;happy-dom
paketini kullanır.edge-runtime
: Vercel'in edge-runtime'ını simüle eder ve@edge-runtime/vm
paketini kullanır.
INFO
jsdom
veya happy-dom
ortamları kullanıldığında, Vitest CSS ve varlıkları içe aktarırken Vite'ın kurallarını takip eder. Harici bağımlılıkları içe aktarma işlemi unknown extension .css
hatasıyla başarısız olursa, tüm içe aktarma zincirini server.deps.external
seçeneğine ekleyerek manuel olarak satır içine almanız gerekir. Örneğin, kaynak kodu -> package-1 -> package-2 -> package-3
şeklindeki bir içe aktarma zincirinde package-3
içinde hata oluşursa, her üç paketi de server.deps.external
'a eklemeniz gerekir.
Vitest 2.0.4'ten itibaren, harici bağımlılıklar içindeki CSS ve varlıkların require
işlemleri otomatik olarak çözülmektedir.
WARNING
Ortamlar yalnızca Node.js'de testler çalıştırılırken kullanılabilir.
browser
, Vitest'te bir ortam olarak kabul edilmez. Testlerinizin bir kısmını Tarayıcı Modu kullanarak çalıştırmak isterseniz, bir çalışma alanı projesi oluşturabilirsiniz.
Belirli Dosyalar İçin Ortamlar
Yapılandırmanızda environment
seçeneğini ayarladığınızda, bu ayar projenizdeki tüm test dosyalarına uygulanır. Daha ayrıntılı kontrol sağlamak için, belirli dosyalar için ortamı belirtmek üzere kontrol yorumlarını kullanabilirsiniz. Kontrol yorumları, @vitest-environment
ile başlayan ve ardından ortam adının geldiği yorumlardır:
// @vitest-environment jsdom
import { expect, test } from 'vitest';
test('test', () => {
expect(typeof window).not.toBe('undefined');
});
Alternatif olarak, glob desenlerine göre ortamı belirten environmentMatchGlobs
seçeneğini de ayarlayabilirsiniz.
Özel Ortam
Vitest ortamını genişletmek için kendi paketinizi oluşturabilirsiniz. Bunu yapmak için, vitest-environment-${name}
adında bir paket oluşturmalı veya geçerli bir JS/TS dosyasına giden bir yol belirtmelisiniz. Bu paket, Environment
tipinde bir nesne dışa aktarmalıdır:
import type { Environment } from 'vitest';
export default <Environment>{
name: 'custom',
transformMode: 'ssr',
// isteğe bağlı - yalnızca "experimental-vm" havuzunu destekliyorsanız
async setupVM() {
const vm = await import('node:vm');
const context = vm.createContext();
return {
getVmContext() {
return context;
},
teardown() {
// bu ortamla tüm testler çalıştırıldıktan sonra çağrılır.
},
};
},
setup() {
// özel kurulum
return {
teardown() {
// bu ortamla tüm testler çalıştırıldıktan sonra çağrılır.
},
};
},
};
WARNING
Vitest, ortam nesnesinde transformMode
seçeneğini zorunlu kılar. Bu seçenek ssr
veya web
'e eşit olmalıdır. Bu değer, eklentilerin kaynak kodunu nasıl dönüştüreceğini belirler. ssr
olarak ayarlanırsa, eklenti kancaları dosyaları dönüştürürken veya çözerken ssr: true
alır. Aksi takdirde, ssr
false
olarak ayarlanır.
Varsayılan Vitest ortamlarına vitest/environments
girişi aracılığıyla da erişebilirsiniz:
import { builtinEnvironments, populateGlobal } from 'vitest/environments';
console.log(builtinEnvironments); // { jsdom, happy-dom, node, edge-runtime }
Vitest ayrıca, nesnedeki özellikleri genel ad alanına taşımak için kullanılabilecek populateGlobal
yardımcı işlevini de sağlar:
interface PopulateOptions {
// sınıf olmayan işlevler genel ad alanına bağlanmalı mı?
bindFunctions?: boolean;
}
interface PopulateResult {
// değeri orijinal nesnede olmasa bile kopyalanan tüm anahtarların listesi.
keys: Set<string>;
// anahtarlarla geçersiz kılınmış olabilecek orijinal nesnenin bir haritası.
// bu değerleri `teardown` işlevi içinde döndürebilirsiniz.
originals: Map<string | symbol, any>;
}
export function populateGlobal(
global: any,
original: any,
options: PopulateOptions
): PopulateResult;