Test Bağlamı
Playwright Fixtures'dan esinlenerek oluşturulan Vitest'in test bağlamı, testlerinizde kullanabileceğiniz yardımcı araçları, durumları ve test verilerini tanımlamanıza olanak tanır.
Kullanım
Her test fonksiyonunun ilk argümanı bir test bağlamıdır.
import { it } from 'vitest';
it('çalışması gerekir', ctx => {
// Testin adını yazdırır
console.log(ctx.task.name);
});
Yerleşik Test Bağlamı
context.task
Testle ilgili meta verileri içeren, sadece okunabilir bir nesnedir.
context.expect
Geçerli teste bağlı expect
API'si:
import { it } from 'vitest';
it('matematik kolaydır', ({ expect }) => {
expect(2 + 2).toBe(4);
});
Bu API, anlık görüntü testlerini eş zamanlı çalıştırmak için kullanışlıdır, çünkü global expect bunları takip edemez:
import { it } from 'vitest';
it.concurrent('matematik kolaydır', ({ expect }) => {
expect(2 + 2).toMatchInlineSnapshot();
});
it.concurrent('matematik zordur', ({ expect }) => {
expect(2 * 2).toMatchInlineSnapshot();
});
context.skip
Sonraki testin yürütülmesini atlar ve testi atlanmış olarak işaretler:
import { expect, it } from 'vitest';
it('matematik zordur', ({ skip }) => {
skip();
expect(2 + 2).toBe(5);
});
Test Bağlamını Genişletme
Vitest, test bağlamını genişletmeniz için iki farklı yöntem sunar.
test.extend
WARNING
Bu API, Vitest 0.32.3 sürümünden itibaren kullanılabilir.
Playwright gibi, bu metodu özel test verileriyle kendi test
API'nizi tanımlamak ve istediğiniz yerde tekrar kullanmak için kullanabilirsiniz.
Örneğin, önce iki test verisiyle myTest
oluşturuyoruz: todos
ve archive
.
// my-test.ts
import { test } from 'vitest';
const todos = [];
const archive = [];
export const myTest = test.extend({
todos: async ({ task }, use) => {
// Her test fonksiyonundan önce test verisini hazırlayın
todos.push(1, 2, 3);
// Test verisi değerini kullanın
await use(todos);
// Her test fonksiyonundan sonra test verisini temizle/sıfırla
todos.length = 0;
},
archive,
});
Sonrasında içe aktarabilir ve kullanabilirsiniz.
import { expect } from 'vitest';
import { myTest } from './my-test.ts';
myTest('öğeleri yapılacaklara ekle', ({ todos }) => {
expect(todos.length).toBe(3);
todos.push(4);
expect(todos.length).toBe(4);
});
myTest('öğeleri yapılacaklardan arşive taşı', ({ todos, archive }) => {
expect(todos.length).toBe(3);
expect(archive.length).toBe(0);
archive.push(todos.pop()!); // pop() undefined döndürebilir, bu yüzden ! operatörü ekledik
expect(todos.length).toBe(2);
expect(archive.length).toBe(1);
});
myTest
'i genişleterek daha fazla test verisi ekleyebilir veya mevcut test verilerini geçersiz kılabiliriz.
export const myTest2 = myTest.extend({
settings: {
// ...
},
});
Fikstür Başlatma
Vitest çalıştırıcısı, test verilerinizi akıllıca başlatır ve kullanıma bağlı olarak test bağlamına yerleştirir.
import { test } from 'vitest';
async function todosFn({ task }, use: (todos: number[]) => Promise<void>) {
await use([1, 2, 3]);
}
const myTest = test.extend({
todos: todosFn,
archive: [],
});
// todosFn çalışmayacak.
myTest('', () => {});
myTest('', ({ archive }) => {});
// todosFn çalışacak.
myTest('', ({ todos }) => {});
WARNING
test.extend()
'i test verileriyle kullanırken, hem test verisi fonksiyonunda hem de test fonksiyonunda bağlama erişmek için her zaman nesne yapısını çözme yöntemini { todos }
kullanmalısınız.
TypeScript
Tüm özel bağlamlarınız için özellik tipleri tanımlamak için, test verisi tipini genel tip olarak geçirebilirsiniz.
interface MyFixtures {
todos: number[];
archive: number[];
}
const myTest = test.extend<MyFixtures>({
todos: [],
archive: [],
});
myTest('', context => {
expectTypeOf(context.todos).toEqualTypeOf<number[]>();
expectTypeOf(context.archive).toEqualTypeOf<number[]>();
});
beforeEach
ve afterEach
Bağlamlar her test için farklıdır. beforeEach
ve afterEach
kanca fonksiyonları içinde bunlara erişebilir ve bunları genişletebilirsiniz.
import { beforeEach, it } from 'vitest';
beforeEach(async context => {
// Bağlamı genişlet
context.foo = 'bar';
});
it('çalışması gerekir', ({ foo }) => {
console.log(foo); // 'bar'
});
TypeScript
Tüm özel bağlamlarınız için özellik tipleri tanımlamak için, TestContext
tipini aşağıdaki gibi genişletebilirsiniz:
declare module 'vitest' {
export interface TestContext {
foo?: string;
}
}
Sadece belirli beforeEach
, afterEach
, it
ve test
fonksiyonları için özellik tipleri tanımlamak istiyorsanız, tipi generic olarak geçirebilirsiniz.
interface LocalTestContext {
foo: string;
}
beforeEach<LocalTestContext>(async context => {
// typeof context is 'TestContext & LocalTestContext'
context.foo = 'bar';
});
it<LocalTestContext>('çalışması gerekir', ({ foo }) => {
// typeof foo is 'string'
console.log(foo); // 'bar'
});