Search the reference...
/
BuildDocsReferenceGuidesBlogDiscord/bun:testFafterAllFafterEachFbeforeAllFbeforeEachVdescribeVexpectVexpectTypeOfNjestVmockFonTestFinishedFsetDefaultTimeoutFsetSystemTimeFspyOnVtestVviVxdescribeVxtestmodule
bun:testThe 'bun:test' module is a fast, built-in test runner that aims for Jest compatibility. Tests are executed with the Bun runtime, providing significantly improved performance over traditional test runners.Key features include TypeScript and JSX support, lifecycle hooks (beforeAll, beforeEach, afterEach, afterAll), snapshot testing, UI & DOM testing, watch mode, and script pre-loading. The API supports test assertions with expect, test grouping with describe, mocks, and more.While Bun aims for compatibility with Jest, not everything is implemented yet. Use bun test to automatically discover and run tests matching common patterns like *.test.ts or *.spec.js.namespace jesttype MockT extends (...args: any[]) => any = (...args: any[]) => any> = JestMock.MockT>Constructs the type of a mock function, e.g. the return type of jest.fn().type ReplacedT> = JestMock.ReplacedT>Constructs the type of a replaced property.type SpiedT extends JestMock.ClassLike | (...args: any[]) => any> = JestMock.SpiedT>Constructs the type of a spied class or function.type SpiedClassT extends JestMock.ClassLike> = JestMock.SpiedClassT>Constructs the type of a spied class.type SpiedFunctionT extends (...args: any[]) => any> = JestMock.SpiedFunctionT>Constructs the type of a spied function.type SpiedGetterT> = JestMock.SpiedGetterT>Constructs the type of a spied getter.type SpiedSetterT> = JestMock.SpiedSetterT>Constructs the type of a spied setter.function advanceTimersByTime(milliseconds: number): { advanceTimersByTime: (milliseconds: number) => unknown; advanceTimersToNextTimer: () => unknown; clearAllMocks: () => void; clearAllTimers: () => void; fn: (func?: T) => MockT>; getTimerCount: () => number; isFakeTimers: () => boolean; mock: (id: string, factory: () => any) => void | Promisevoid>; resetAllMocks: () => void; restoreAllMocks: () => void; runAllTimers: () => unknown; runOnlyPendingTimers: () => unknown; spyOn: (obj: T, methodOrPropertyValue: K) => MockExtractT[K], (...args: any[]) => any>>; useFakeTimers: (options?: { now: number | Date }) => unknown; useRealTimers: () => unknown };function advanceTimersToNextTimer(): { advanceTimersByTime: (milliseconds: number) => unknown; advanceTimersToNextTimer: () => unknown; clearAllMocks: () => void; clearAllTimers: () => void; fn: (func?: T) => MockT>; getTimerCount: () => number; isFakeTimers: () => boolean; mock: (id: string, factory: () => any) => void | Promisevoid>; resetAllMocks: () => void; restoreAllMocks: () => void; runAllTimers: () => unknown; runOnlyPendingTimers: () => unknown; spyOn: (obj: T, methodOrPropertyValue: K) => MockExtractT[K], (...args: any[]) => any>>; useFakeTimers: (options?: { now: number | Date }) => unknown; useRealTimers: () => unknown };function clearAllMocks(): void;function clearAllTimers(): void;function fnT extends (...args: any[]) => any>(func?: T): MockT>;function getTimerCount(): number;function isFakeTimers(): boolean;function resetAllMocks(): void;function restoreAllMocks(): void;function runAllTimers(): { advanceTimersByTime: (milliseconds: number) => unknown; advanceTimersToNextTimer: () => unknown; clearAllMocks: () => void; clearAllTimers: () => void; fn: (func?: T) => MockT>; getTimerCount: () => number; isFakeTimers: () => boolean; mock: (id: string, factory: () => any) => void | Promisevoid>; resetAllMocks: () => void; restoreAllMocks: () => void; runAllTimers: () => unknown; runOnlyPendingTimers: () => unknown; spyOn: (obj: T, methodOrPropertyValue: K) => MockExtractT[K], (...args: any[]) => any>>; useFakeTimers: (options?: { now: number | Date }) => unknown; useRealTimers: () => unknown };function runOnlyPendingTimers(): { advanceTimersByTime: (milliseconds: number) => unknown; advanceTimersToNextTimer: () => unknown; clearAllMocks: () => void; clearAllTimers: () => void; fn: (func?: T) => MockT>; getTimerCount: () => number; isFakeTimers: () => boolean; mock: (id: string, factory: () => any) => void | Promisevoid>; resetAllMocks: () => void; restoreAllMocks: () => void; runAllTimers: () => unknown; runOnlyPendingTimers: () => unknown; spyOn: (obj: T, methodOrPropertyValue: K) => MockExtractT[K], (...args: any[]) => any>>; useFakeTimers: (options?: { now: number | Date }) => unknown; useRealTimers: () => unknown };function setSystemTime(now?: number | Date): void;function setTimeout(milliseconds: number): void;function spyOnT extends object, K extends string | number | symbol>(obj: T,methodOrPropertyValue: K): MockExtractT[K], (...args: any[]) => any>>;function useFakeTimers(options?: { now: number | Date }): { advanceTimersByTime: (milliseconds: number) => unknown; advanceTimersToNextTimer: () => unknown; clearAllMocks: () => void; clearAllTimers: () => void; fn: (func?: T) => MockT>; getTimerCount: () => number; isFakeTimers: () => boolean; mock: (id: string, factory: () => any) => void | Promisevoid>; resetAllMocks: () => void; restoreAllMocks: () => void; runAllTimers: () => unknown; runOnlyPendingTimers: () => unknown; spyOn: (obj: T, methodOrPropertyValue: K) => MockExtractT[K], (...args: any[]) => any>>; useFakeTimers: (options?: { now: number | Date }) => unknown; useRealTimers: () => unknown };function useRealTimers(): { advanceTimersByTime: (milliseconds: number) => unknown; advanceTimersToNextTimer: () => unknown; clearAllMocks: () => void; clearAllTimers: () => void; fn: (func?: T) => MockT>; getTimerCount: () => number; isFakeTimers: () => boolean; mock: (id: string, factory: () => any) => void | Promisevoid>; resetAllMocks: () => void; restoreAllMocks: () => void; runAllTimers: () => unknown; runOnlyPendingTimers: () => unknown; spyOn: (obj: T, methodOrPropertyValue: K) => MockExtractT[K], (...args: any[]) => any>>; useFakeTimers: (options?: { now: number | Date }) => unknown; useRealTimers: () => unknown };const describe: Describe[]>Describes a group of related tests.function sum(a, b) { return a + b; } describe("sum()", () => { test("can sum two values", () => { expect(sum(1, 1)).toBe(2); }); }); const expect: ExpectAsserts that a value matches some criteria.expect(1 + 1).toBe(2); expect([1,2,3]).toContain(2); expect(null).toBeNull(); const expectTypeOf: expectTypeOfconst mock: (Function?: T) => MockT>const test: Test[]>Runs a test.test("can check if using Bun", () => { expect(Bun).toBeDefined(); }); test("can make a fetch() request", async () => { const response = await fetch("https://example.com/"); expect(response.ok).toBe(true); }); const vi: { advanceTimersByTime: typeof jest.advanceTimersByTime; advanceTimersToNextTimer: typeof jest.advanceTimersToNextTimer; clearAllMocks: typeof jest.clearAllMocks; clearAllTimers: typeof jest.clearAllTimers; fn: typeof jest.fn; getTimerCount: typeof jest.getTimerCount; isFakeTimers: typeof jest.isFakeTimers; mock: typeof mock.module; resetAllMocks: typeof jest.resetAllMocks; restoreAllMocks: typeof jest.restoreAllMocks; runAllTimers: typeof jest.runAllTimers; runOnlyPendingTimers: typeof jest.runOnlyPendingTimers; spyOn: typeof spyOn; useFakeTimers: typeof jest.useFakeTimers; useRealTimers: typeof jest.useRealTimers }Vitest-compatible mocking utilities Provides Vitest-style mocking API for easier migration from Vitest to Bunconst xdescribe: Describe[]>Skips a group of related tests.This is equivalent to calling describe.skip().const xtest: Test[]>Skips a test.This is equivalent to calling test.skip().function afterAll(fn: () => void | Promiseunknown> | (done: (err?: unknown) => void) => void,options?: HookOptions): void;Runs a function, once, after all the tests.This is useful for running clean up tasks, like closing a socket or deleting temporary files.@param fnthe function to runlet database; afterAll(async () => { if (database) { await database.close(); } }); function afterEach(fn: () => void | Promiseunknown> | (done: (err?: unknown) => void) => void,options?: HookOptions): void;Runs a function after each test.This is useful for running clean up tasks, like closing a socket or deleting temporary files.@param fnthe function to runfunction beforeAll(fn: () => void | Promiseunknown> | (done: (err?: unknown) => void) => void,options?: HookOptions): void;Runs a function, once, before all the tests.This is useful for running set up tasks, like initializing a global variable or connecting to a database.If this function throws, tests will not run in this file.@param fnthe function to runlet database; beforeAll(async () => { database = await connect("localhost"); }); function beforeEach(fn: () => void | Promiseunknown> | (done: (err?: unknown) => void) => void,options?: HookOptions): void;Runs a function before each test.This is useful for running set up tasks, like initializing a global variable or connecting to a database.If this function throws, the test will not run.@param fnthe function to runfunction onTestFinished(fn: () => void | Promiseunknown> | (done: (err?: unknown) => void) => void,options?: HookOptions): void;Runs a function after a test finishes, including after all afterEach hooks.This is useful for cleanup tasks that need to run at the very end of a test, after all other hooks have completed.Can only be called inside a test, not in describe blocks.@param fnthe function to runtest("my test", () => { onTestFinished(() => { // This runs after all afterEach hooks console.log("Test finished!"); }); }); function setDefaultTimeout(milliseconds: number): void;Sets the default timeout for all tests in the current file. If a test specifies a timeout, it will override this value. The default timeout is 5000ms (5 seconds).@param millisecondsthe number of milliseconds for the default timeoutfunction setSystemTime(now?: number | Date): ThisTypevoid>;Control the system time used by:Date.now()new Date()Intl.DateTimeFormat().format()In the future, we may add support for more functions, but we haven't done that yet.@param nowThe time to set the system time to. If not provided, the system time will be reset.@returnsthisfunction spyOnT extends object, K extends string | number | symbol>(obj: T,methodOrPropertyValue: K): MockExtractT[K], (...args: any[]) => any>>;Create a spy on an object property or methodType definitionsinterface AsymmetricMatchersYou can extend this interface with declaration merging, in order to add type support for custom asymmetric matchers.// my_modules.d.ts interface MyCustomMatchers { toBeWithinRange(floor: number, ceiling: number): any; } declare module "bun:test" { interface MatchersT> extends MyCustomMatchers {} interface AsymmetricMatchers extends MyCustomMatchers {} } any(constructor: (...args: any[]) => any | new (...args: any[]) => any): any;Matches anything that was created with the given constructor. You can use it inside toEqual or toBeCalledWith instead of a literal value.function randocall(fn) { return fn(Math.floor(Math.random() * 6 + 1)); } test('randocall calls its callback with a number', () => { const mock = jest.fn(); randocall(mock); expect(mock).toBeCalledWith(expect.any(Number)); }); anything(): any;Matches anything but null or undefined. You can use it inside toEqual or toBeCalledWith instead of a literal value. For example, if you want to check that a mock function is called with a non-null argument:test('map calls its argument with a non-null argument', () => { const mock = jest.fn(); [1].map(x => mock(x)); expect(mock).toBeCalledWith(expect.anything()); }); arrayContainingE = any>(arr: readonly E[]): any;Matches any array made up entirely of elements in the provided array. You can use it inside toEqual or toBeCalledWith instead of a literal value.Optionally, you can provide a type for the elements via a generic.closeTo(num: number,numDigits?: number): any;Useful when comparing floating point numbers in object properties or array item. If you need to compare a number, use .toBeCloseTo instead.The optional numDigits argument limits the number of digits to check after the decimal point. For the default value 2, the test criterion is Math.abs(expected - received) (that is, 10 ** -2 / 2).objectContaining(obj: object): any;Matches any object that recursively matches the provided keys. This is often handy in conjunction with other asymmetric matchers.Optionally, you can provide a type for the object via a generic. This ensures that the object contains the desired structure.stringContaining(str: string | String): any;Matches any received string that contains the exact expected stringstringMatching(regex: string | String | RegExp): any;Matches any string that contains the exact provided stringinterface AsymmetricMatchersBuiltinany(constructor: (...args: any[]) => any | new (...args: any[]) => any): any;Matches anything that was created with the given constructor. You can use it inside toEqual or toBeCalledWith instead of a literal value.function randocall(fn) { return fn(Math.floor(Math.random() * 6 + 1)); } test('randocall calls its callback with a number', () => { const mock = jest.fn(); randocall(mock); expect(mock).toBeCalledWith(expect.any(Number)); }); anything(): any;Matches anything but null or undefined. You can use it inside toEqual or toBeCalledWith instead of a literal value. For example, if you want to check that a mock function is called with a non-null argument:test('map calls its argument with a non-null argument', () => { const mock = jest.fn(); [1].map(x => mock(x)); expect(mock).toBeCalledWith(expect.anything()); }); arrayContainingE = any>(arr: readonly E[]): any;Matches any array made up entirely of elements in the provided array. You can use it inside toEqual or toBeCalledWith instead of a literal value.Optionally, you can provide a type for the elements via a generic.closeTo(num: number,numDigits?: number): any;Useful when comparing floating point numbers in object properties or array item. If you need to compare a number, use .toBeCloseTo instead.The optional numDigits argument limits the number of digits to check after the decimal point. For the default value 2, the test criterion is Math.abs(expected - received) (that is, 10 ** -2 / 2).objectContaining(obj: object): any;Matches any object that recursively matches the provided keys. This is often handy in conjunction with other asymmetric matchers.Optionally, you can provide a type for the object via a generic. This ensures that the object contains the desired structure.stringContaining(str: string | String): any;Matches any received string that contains the exact expected stringstringMatching(regex: string | String | RegExp): any;Matches any string that contains the exact provided stringinterface DescribeT extends Readonlyany[]>>Describes a group of related tests.function sum(a, b) { return a + b; } describe("sum()", () => { test("can sum two values", () => { expect(sum(1, 1)).toBe(2); }); }); concurrent: DescribeT>Marks this group of tests to be executed concurrently.only: DescribeT>Skips all other tests, except this group of tests.serial: DescribeT>Marks this group of tests to be executed serially (one after another), even when the --concurrent flag is used.skip: DescribeT>Skips this group of tests.todo: DescribeT>Marks this group of tests as to be written or to be fixed.eachT extends any[]>(table: readonly T[]): Describe[...T[]]>;eachT>(table: T[]): Describe[T]>;if(condition: boolean): DescribeT>;Runs this group of tests, only if condition is true.This is the opposite of describe.skipIf().@param conditionif these tests should runskipIf(condition: boolean): DescribeT>;Skips this group of tests, if condition is true.@param conditionif these tests should be skippedtodoIf(condition: boolean): DescribeT>;Marks this group of tests as to be written or to be fixed, if condition is true.@param conditionif these tests should be skippedinterface ExpectYou can extend this interface with declaration merging, in order to add type support for custom asymmetric matchers.// my_modules.d.ts interface MyCustomMatchers { toBeWithinRange(floor: number, ceiling: number): any; } declare module "bun:test" { interface MatchersT> extends MyCustomMatchers {} interface AsymmetricMatchers extends MyCustomMatchers {} } not: ExpectNotAccess to negated asymmetric matchers.expect("abc").toEqual(expect.stringContaining("abc")); // will pass expect("abc").toEqual(expect.not.stringContaining("abc")); // will fail rejectsTo: AsymmetricMatchersCreate an asymmetric matcher for a promise rejected value.expect(Promise.reject("error")).toEqual(expect.rejectsTo.stringContaining("error")); // will pass expect(Promise.resolve("error")).toEqual(expect.rejectsTo.stringContaining("error")); // will fail expect("error").toEqual(expect.rejectsTo.stringContaining("error")); // will fail resolvesTo: AsymmetricMatchersCreate an asymmetric matcher for a promise resolved value.expect(Promise.resolve("value")).toEqual(expect.resolvesTo.stringContaining("value")); // will pass expect(Promise.reject("value")).toEqual(expect.resolvesTo.stringContaining("value")); // will fail expect("value").toEqual(expect.resolvesTo.stringContaining("value")); // will fail any(constructor: (...args: any[]) => any | new (...args: any[]) => any): any;Matches anything that was created with the given constructor. You can use it inside toEqual or toBeCalledWith instead of a literal value.function randocall(fn) { return fn(Math.floor(Math.random() * 6 + 1)); } test('randocall calls its callback with a number', () => { const mock = jest.fn(); randocall(mock); expect(mock).toBeCalledWith(expect.any(Number)); }); anything(): any;Matches anything but null or undefined. You can use it inside toEqual or toBeCalledWith instead of a literal value. For example, if you want to check that a mock function is called with a non-null argument:test('map calls its argument with a non-null argument', () => { const mock = jest.fn(); [1].map(x => mock(x)); expect(mock).toBeCalledWith(expect.anything()); }); arrayContainingE = any>(arr: readonly E[]): any;Matches any array made up entirely of elements in the provided array. You can use it inside toEqual or toBeCalledWith instead of a literal value.Optionally, you can provide a type for the elements via a generic.assertions(neededAssertions: number): void;Ensures that a specific number of assertions are madecloseTo(num: number,numDigits?: number): any;Useful when comparing floating point numbers in object properties or array item. If you need to compare a number, use .toBeCloseTo instead.The optional numDigits argument limits the number of digits to check after the decimal point. For the default value 2, the test criterion is Math.abs(expected - received) (that is, 10 ** -2 / 2).extendM>(matchers: ExpectExtendMatchersM>): void;Register new custom matchers.@param matchersAn object containing the matchers to register, where each key is the matcher name, and its value the implementation function. The function must satisfy: (actualValue, ...matcherInstantiationArguments) => { pass: true|false, message: () => string }expect.extend({ toBeWithinRange(actual, min, max) { if (typeof actual !== 'number' || typeof min !== 'number' || typeof max !== 'number') throw new Error('Invalid usage'); const pass = actual >= min && actual max; return { pass: pass, message: () => `expected ${this.utils.printReceived(actual)} ` + (pass ? `not to be`: `to be`) + ` within range ${this.utils.printExpected(`${min} .. ${max}`)}`, }; }, }); test('some test', () => { expect(50).toBeWithinRange(0, 100); // will pass expect(50).toBeWithinRange(100, 200); // will fail expect(50).toBe(expect.toBeWithinRange(0, 100)); // will pass expect(50).toBe(expect.not.toBeWithinRange(100, 200)); // will pass }); hasAssertions(): void;Ensures that an assertion is madeobjectContaining(obj: object): any;Matches any object that recursively matches the provided keys. This is often handy in conjunction with other asymmetric matchers.Optionally, you can provide a type for the object via a generic. This ensures that the object contains the desired structure.stringContaining(str: string | String): any;Matches any received string that contains the exact expected stringstringMatching(regex: string | String | RegExp): any;Matches any string that contains the exact provided stringunreachable(msg?: string | Error): never;Throw an error if this function is called.@param msgOptional message to display if the test fails@returnsneverimport { expect, test } from "bun:test"; test("!!abc!! is not a module", () => { try { require("!!abc!!"); expect.unreachable(); } catch(e) { expect(e.name).not.toBe("UnreachableError"); } }); interface MatcherResultmessage?: string | () => stringpass: booleaninterface MatchersT = unknown>You can extend this interface with declaration merging, in order to add type support for custom matchers.// my_modules.d.ts interface MyCustomMatchers { toBeWithinRange(floor: number, ceiling: number): any; } declare module "bun:test" { interface MatchersT> extends MyCustomMatchers {} interface AsymmetricMatchers extends MyCustomMatchers {} } fail: (message?: string) => voidAssertion which fails.expect().fail(); expect().fail("message is optional"); expect().not.fail(); expect().not.fail("hi"); not: Matchersunknown>Negates the result of a subsequent assertion. If you know how to test something, .not lets you test its opposite.expect(1).not.toBe(0); expect(null).not.toBeNull(); pass: (message?: string) => voidAssertion which passes.expect().pass(); expect().pass("message is optional"); expect().not.pass(); expect().not.pass("hi"); rejects: Matchersunknown>Expects the value to be a promise that rejects.expect(Promise.reject("error")).rejects.toBe("error"); resolves: MatchersAwaitedT>>Expects the value to be a promise that resolves.expect(Promise.resolve(1)).resolves.toBe(1); lastCalledWith(...expected: unknown[]): void;Ensure that a mock function is called with specific arguments for the nth call.nthCalledWith(n: number,...expected: unknown[]): void;Ensure that a mock function is called with specific arguments for the nth call.toBe(expected: T): void;Asserts that a value equals what is expected.For non-primitive values, like objects and arrays, use toEqual() instead.For floating-point numbers, use toBeCloseTo() instead.@param expectedthe expected valueexpect(100 + 23).toBe(123); expect("d" + "og").toBe("dog"); expect([123]).toBe([123]); // fail, use toEqual() expect(3 + 0.14).toBe(3.14); // fail, use toBeCloseTo() // TypeScript errors: expect("hello").toBe(3.14); // typescript error + fail expect("hello").toBenumber>(3.14); // no typescript error, but still fails toBeX = T>(expected: NoInferX>): void;toBeArray(): void;Asserts that a value is a array.expect([1]).toBeArray(); expect(new Array(1)).toBeArray(); expect({}).not.toBeArray(); toBeArrayOfSize(size: number): void;Asserts that a value is a array of a certain length.expect([]).toBeArrayOfSize(0); expect([1]).toBeArrayOfSize(1); expect(new Array(1)).toBeArrayOfSize(1); expect({}).not.toBeArrayOfSize(0); toBeBoolean(): void;Asserts that a value is a boolean.expect(true).toBeBoolean(); expect(false).toBeBoolean(); expect(null).not.toBeBoolean(); expect(0).not.toBeBoolean(); toBeCalled(): void;Ensures that a mock function is called an exact number of times.toBeCalledTimes(expected: number): void;Ensure that a mock function is called with specific arguments.toBeCalledWith(...expected: unknown[]): void;Ensure that a mock function is called with specific arguments.toBeCloseTo(expected: number,numDigits?: number): void;Asserts that value is close to the expected by floating point precision.For example, the following fails because arithmetic on decimal (base 10) values often have rounding errors in limited precision binary (base 2) representation.@param expectedthe expected value@param numDigitsthe number of digits to check after the decimal point. Default is 2expect(0.2 + 0.1).toBe(0.3); // fails Use `toBeCloseTo` to compare floating point numbers for approximate equality. toBeDate(): void;Asserts that a value is a Date object.To check if a date is valid, use toBeValidDate() instead.expect(new Date()).toBeDate(); expect(new Date(null)).toBeDate(); expect("2020-03-01").not.toBeDate(); toBeDefined(): void;Asserts that a value is defined. (e.g. is not undefined)expect(true).toBeDefined(); expect(undefined).toBeDefined(); // fail toBeEmpty(): void;Asserts that a value is empty.expect("").toBeEmpty(); expect([]).toBeEmpty(); expect({}).toBeEmpty(); expect(new Set()).toBeEmpty(); toBeEmptyObject(): void;Asserts that a value is an empty object.expect({}).toBeEmptyObject(); expect({ a: 'hello' }).not.toBeEmptyObject(); toBeEven(): void;Asserts that a number is even.expect(2).toBeEven(); expect(1).not.toBeEven(); toBeFalse(): void;Asserts that a value is false.expect(false).toBeFalse(); expect(true).not.toBeFalse(); expect(0).not.toBeFalse(); toBeFalsy(): void;Asserts that a value is "falsy".To assert that a value equals false, use toBe(false) instead.expect(true).toBeTruthy(); expect(1).toBeTruthy(); expect({}).toBeTruthy(); toBeFinite(): void;Asserts that a value is a number, and is not NaN or Infinity.expect(1).toBeFinite(); expect(3.14).toBeFinite(); expect(NaN).not.toBeFinite(); expect(Infinity).not.toBeFinite(); toBeFunction(): void;Asserts that a value is a function.expect(() => {}).toBeFunction(); toBeGreaterThan(expected: number | bigint): void;Asserts that a value is a number and is greater than the expected value.@param expectedthe expected numberexpect(1).toBeGreaterThan(0); expect(3.14).toBeGreaterThan(3); expect(9).toBeGreaterThan(9); // fail toBeGreaterThanOrEqual(expected: number | bigint): void;Asserts that a value is a number and is greater than or equal to the expected value.@param expectedthe expected numberexpect(1).toBeGreaterThanOrEqual(0); expect(3.14).toBeGreaterThanOrEqual(3); expect(9).toBeGreaterThanOrEqual(9); toBeInstanceOf(value: unknown): void;Asserts that the expected value is an instance of valueexpect([]).toBeInstanceOf(Array); expect(null).toBeInstanceOf(Array); // fail toBeInteger(): void;Asserts that a value is a number, and is an integer.expect(1).toBeInteger(); expect(3.14).not.toBeInteger(); expect(NaN).not.toBeInteger(); toBeLessThan(expected: number | bigint): void;Asserts that a value is a number and is less than the expected value.@param expectedthe expected numberexpect(-1).toBeLessThan(0); expect(3).toBeLessThan(3.14); expect(9).toBeLessThan(9); // fail toBeLessThanOrEqual(expected: number | bigint): void;Asserts that a value is a number and is less than or equal to the expected value.@param expectedthe expected numberexpect(-1).toBeLessThanOrEqual(0); expect(3).toBeLessThanOrEqual(3.14); expect(9).toBeLessThanOrEqual(9); toBeNaN(): void;Asserts that a value is NaN.Same as using Number.isNaN().expect(NaN).toBeNaN(); expect(Infinity).toBeNaN(); // fail expect("notanumber").toBeNaN(); // fail toBeNegative(): void;Asserts that a value is a negative number.expect(-3.14).toBeNegative(); expect(1).not.toBeNegative(); expect(NaN).not.toBeNegative(); toBeNil(): void;Asserts that a value is null or undefined.expect(null).toBeNil(); expect(undefined).toBeNil(); toBeNull(): void;Asserts that a value is null.expect(null).toBeNull(); expect(undefined).toBeNull(); // fail toBeNumber(): void;Asserts that a value is a number.expect(1).toBeNumber(); expect(3.14).toBeNumber(); expect(NaN).toBeNumber(); expect(BigInt(1)).not.toBeNumber(); toBeObject(): void;Asserts that a value is an object.expect({}).toBeObject(); expect("notAnObject").not.toBeObject(); expect(NaN).not.toBeObject(); toBeOdd(): void;Asserts that a number is odd.expect(1).toBeOdd(); expect(2).not.toBeOdd(); toBeOneOf(expected: IterableT>): void;Asserts that the value is deep equal to an element in the expected array.The value must be an array or iterable, which includes strings.@param expectedthe expected valueexpect(1).toBeOneOf([1,2,3]); expect("foo").toBeOneOf(["foo", "bar"]); expect(true).toBeOneOf(new Set([true])); toBeOneOfX = T>(expected: NoInferIterableX, any, any>>): void;toBePositive(): void;Asserts that a value is a positive number.expect(1).toBePositive(); expect(-3.14).not.toBePositive(); expect(NaN).not.toBePositive(); toBeString(): void;Asserts that a value is a string.expect("foo").toBeString(); expect(new String("bar")).toBeString(); expect(123).not.toBeString(); toBeSymbol(): void;Asserts that a value is a symbol.expect(Symbol("foo")).toBeSymbol(); expect("foo").not.toBeSymbol(); toBeTrue(): void;Asserts that a value is true.expect(true).toBeTrue(); expect(false).not.toBeTrue(); expect(1).not.toBeTrue(); toBeTruthy(): void;Asserts that a value is "truthy".To assert that a value equals true, use toBe(true) instead.expect(true).toBeTruthy(); expect(1).toBeTruthy(); expect({}).toBeTruthy(); toBeTypeOf(type: 'string' | 'number' | 'bigint' | 'boolean' | 'symbol' | 'undefined' | 'object' | 'function'): void;Asserts that a value matches a specific type.expect(1).toBeTypeOf("number"); expect("hello").toBeTypeOf("string"); expect([]).not.toBeTypeOf("boolean"); toBeUndefined(): void;Asserts that a value is undefined.expect(undefined).toBeUndefined(); expect(null).toBeUndefined(); // fail toBeValidDate(): void;Asserts that a value is a valid Date object.expect(new Date()).toBeValidDate(); expect(new Date(null)).not.toBeValidDate(); expect("2020-03-01").not.toBeValidDate(); toBeWithin(start: number,end: number): void;Asserts that a value is a number between a start and end value.@param startthe start number (inclusive)@param endthe end number (exclusive)toContain(expected: T extends IterableU, any, any> ? U : T): void;Asserts that a value contains what is expected.The value must be an array or iterable, which includes strings.@param expectedthe expected valueexpect([1, 2, 3]).toContain(1); expect(new Set([true])).toContain(true); expect("hello").toContain("o"); toContainX = T>(expected: NoInferX extends IterableU, any, any> ? U : X>): void;toContainAllKeys(expected: IfNeverThenElsekeyof T, PropertyKey>[]): void;Asserts that an object contains all the provided keys.The value must be an object@param expectedthe expected valueexpect({ a: 'hello', b: 'world' }).toContainAllKeys(['a','b']); expect({ a: 'hello', b: 'world' }).toContainAllKeys(['b','a']); expect({ 1: 'hello', b: 'world' }).toContainAllKeys([1,'b']); expect({ a: 'hello', b: 'world' }).not.toContainAllKeys(['c']); expect({ a: 'hello', b: 'world' }).not.toContainAllKeys(['a']); toContainAllKeysX = T>(expected: IfNeverThenElseNoInferkeyof X>, PropertyKey>[]): void;toContainAllValues(expected: unknown[]): void;Asserts that an object contain all the provided values.The value must be an object@param expectedthe expected valueconst o = { a: 'foo', b: 'bar', c: 'baz' }; expect(o).toContainAllValues(['foo', 'bar', 'baz']); expect(o).toContainAllValues(['baz', 'bar', 'foo']); expect(o).not.toContainAllValues(['bar', 'foo']); toContainAnyKeys(expected: IfNeverThenElsekeyof T, PropertyKey>[]): void;Asserts that an object contains at least one of the provided keys. Asserts that an object contains all the provided keys.The value must be an object@param expectedthe expected valueexpect({ a: 'hello', b: 'world' }).toContainAnyKeys(['a']); expect({ a: 'hello', b: 'world' }).toContainAnyKeys(['b']); expect({ a: 'hello', b: 'world' }).toContainAnyKeys(['b', 'c']); expect({ a: 'hello', b: 'world' }).not.toContainAnyKeys(['c']); toContainAnyKeysX = T>(expected: IfNeverThenElseNoInferkeyof X>, PropertyKey>[]): void;toContainAnyValues(expected: unknown[]): void;Asserts that an object contain any provided value.The value must be an object@param expectedthe expected valueconst o = { a: 'foo', b: 'bar', c: 'baz' }; expect(o).toContainAnyValues(['qux', 'foo']); expect(o).toContainAnyValues(['qux', 'bar']); expect(o).toContainAnyValues(['qux', 'baz']); expect(o).not.toContainAnyValues(['qux']); toContainEqual(expected: T extends IterableU, any, any> ? U : T): void;Asserts that a value contains and equals what is expected.This matcher will perform a deep equality check for members of arrays, rather than checking for object identity.@param expectedthe expected valueexpect([{ a: 1 }]).toContainEqual({ a: 1 }); expect([{ a: 1 }]).not.toContainEqual({ a: 2 }); toContainEqualX = T>(expected: NoInferX extends IterableU, any, any> ? U : X>): void;toContainKey(expected: IfNeverThenElsekeyof T, PropertyKey>): void;Asserts that an object contains a key.The value must be an object@param expectedthe expected valueexpect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKey('a'); expect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKey('b'); expect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKey('c'); expect({ a: 'foo', b: 'bar', c: 'baz' }).not.toContainKey('d'); toContainKeyX = T>(expected: IfNeverThenElseNoInferkeyof X>, PropertyKey>): void;toContainKeys(expected: IfNeverThenElsekeyof T, PropertyKey>[]): void;Asserts that an object contains all the provided keys.@param expectedthe expected valueexpect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKeys(['a', 'b']); expect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKeys(['a', 'b', 'c']); expect({ a: 'foo', b: 'bar', c: 'baz' }).not.toContainKeys(['a', 'b', 'e']); toContainKeysX = T>(expected: IfNeverThenElseNoInferkeyof X>, PropertyKey>[]): void;toContainValue(expected: unknown): void;Asserts that an object contain the provided value.This method is deep and will look through child properties to find the expected value.The input value must be an object.@param expectedthe expected valueconst shallow = { hello: "world" }; const deep = { message: shallow }; const deepArray = { message: [shallow] }; const o = { a: "foo", b: [1, "hello", true], c: "baz" }; expect(shallow).toContainValue("world"); expect({ foo: false }).toContainValue(false); expect(deep).toContainValue({ hello: "world" }); expect(deepArray).toContainValue([{ hello: "world" }]); expect(o).toContainValue("foo", "barr"); expect(o).toContainValue([1, "hello", true]); expect(o).not.toContainValue("qux"); // NOT expect(shallow).not.toContainValue("foo"); expect(deep).not.toContainValue({ foo: "bar" }); expect(deepArray).not.toContainValue([{ foo: "bar" }]); toContainValues(expected: unknown[]): void;Asserts that an object contain the provided value.This is the same as toContainValue, but accepts an array of values instead.The value must be an object@param expectedthe expected valueconst o = { a: 'foo', b: 'bar', c: 'baz' }; expect(o).toContainValues(['foo']); expect(o).toContainValues(['baz', 'bar']); expect(o).not.toContainValues(['qux', 'foo']); toEndWith(expected: string): void;Asserts that a value ends with a string.@param expectedthe string to end withtoEqual(expected: T): void;Asserts that a value is deeply equal to what is expected.@param expectedthe expected valueexpect(100 + 23).toBe(123); expect("d" + "og").toBe("dog"); expect([456]).toEqual([456]); expect({ value: 1 }).toEqual({ value: 1 }); toEqualX = T>(expected: NoInferX>): void;toEqualIgnoringWhitespace(expected: string): void;Asserts that a value is equal to the expected string, ignoring any whitespace.@param expectedthe expected stringexpect(" foo ").toEqualIgnoringWhitespace("foo"); expect("bar").toEqualIgnoringWhitespace(" bar "); toHaveBeenCalled(): void;Ensures that a mock function is called.toHaveBeenCalledTimes(expected: number): void;Ensures that a mock function is called an exact number of times.toHaveBeenCalledWith(...expected: unknown[]): void;Ensure that a mock function is called with specific arguments.toHaveBeenLastCalledWith(...expected: unknown[]): void;Ensure that a mock function is called with specific arguments for the last call.toHaveBeenNthCalledWith(n: number,...expected: unknown[]): void;Ensure that a mock function is called with specific arguments for the nth call.toHaveLastReturnedWith(expected: unknown): void;Ensures that a mock function has returned a specific value on its last invocation. This matcher uses deep equality, like toEqual(), and supports asymmetric matchers.toHaveLength(length: number): void;Asserts that a value has a .length property that is equal to the expected length.@param lengththe expected lengthexpect([]).toHaveLength(0); expect("hello").toHaveLength(4); toHaveNthReturnedWith(n: number,expected: unknown): void;Ensures that a mock function has returned a specific value on the nth invocation. This matcher uses deep equality, like toEqual(), and supports asymmetric matchers.@param nThe 1-based index of the function call@param expectedThe expected return valuetoHaveProperty(keyPath: string | number | string | number[],value?: unknown): void;Asserts that a value has a property with the expected name, and value if provided.@param keyPaththe expected property name or path, or an index@param valuethe expected property value, if providedexpect(new Set()).toHaveProperty("size"); expect(new Uint8Array()).toHaveProperty("byteLength", 0); expect({ kitchen: { area: 20 }}).toHaveProperty("kitchen.area", 20); expect({ kitchen: { area: 20 }}).toHaveProperty(["kitchen", "area"], 20); toHaveReturned(): void;Ensures that a mock function has returned successfully at least once.A promise that is unfulfilled will be considered a failure. If the function threw an error, it will be considered a failure.toHaveReturnedTimes(times: number): void;Ensures that a mock function has returned successfully at times times.A promise that is unfulfilled will be considered a failure. If the function threw an error, it will be considered a failure.toHaveReturnedWith(expected: unknown): void;Ensures that a mock function has returned a specific value. This matcher uses deep equality, like toEqual(), and supports asymmetric matchers.toInclude(expected: string): void;Asserts that a value includes a string.For non-string values, use toContain() instead.@param expectedthe expected substringtoIncludeRepeated(expected: string,times: number): void;Asserts that a value includes a string {times} times.@param expectedthe expected substring@param timesthe number of times the substring should occurtoMatch(expected: string | RegExp): void;Asserts that a value matches a regular expression or includes a substring.@param expectedthe expected substring or pattern.expect("dog").toMatch(/dog/); expect("dog").toMatch("og"); toMatchInlineSnapshot(value?: string): void;Asserts that a value matches the most recent inline snapshot.@param valueThe latest automatically-updated snapshot value.expect("Hello").toMatchInlineSnapshot(); expect("Hello").toMatchInlineSnapshot(`"Hello"`); toMatchInlineSnapshot(propertyMatchers?: object,value?: string): void;Asserts that a value matches the most recent inline snapshot.@param propertyMatchersObject containing properties to match against the value.@param valueThe latest automatically-updated snapshot value.expect({ c: new Date() }).toMatchInlineSnapshot({ c: expect.any(Date) }); expect({ c: new Date() }).toMatchInlineSnapshot({ c: expect.any(Date) }, ` { "v": Any, } `); toMatchObject(subset: object): void;Asserts that an object matches a subset of properties.@param subsetSubset of properties to match with.expect({ a: 1, b: 2 }).toMatchObject({ b: 2 }); expect({ c: new Date(), d: 2 }).toMatchObject({ d: 2 }); toMatchSnapshot(hint?: string): void;Asserts that a value matches the most recent snapshot.@param hintHint used to identify the snapshot in the snapshot file.expect([1, 2, 3]).toMatchSnapshot('hint message'); toMatchSnapshot(propertyMatchers?: object,hint?: string): void;Asserts that a value matches the most recent snapshot.@param propertyMatchersObject containing properties to match against the value.@param hintHint used to identify the snapshot in the snapshot file.expect([1, 2, 3]).toMatchSnapshot(); expect({ a: 1, b: 2 }).toMatchSnapshot({ a: 1 }); expect({ c: new Date() }).toMatchSnapshot({ c: expect.any(Date) }); toSatisfy(predicate: (value: T) => boolean): void;Checks whether a value satisfies a custom condition.@param predicateThe custom condition to be satisfied. It should be a function that takes a value as an argument (in this case the value from expect) and returns a boolean.expect(1).toSatisfy((val) => val > 0); expect("foo").toSatisfy((val) => val === "foo"); expect("bar").not.toSatisfy((val) => val === "bun"); toStartWith(expected: string): void;Asserts that a value starts with a string.@param expectedthe string to start withtoStrictEqual(expected: T): void;Asserts that a value is deeply and strictly equal to what is expected.There are two key differences from toEqual():It checks that the class is the same.It checks that undefined values match as well.@param expectedthe expected valueclass Dog { type = "dog"; } const actual = new Dog(); expect(actual).toStrictEqual(new Dog()); expect(actual).toStrictEqual({ type: "dog" }); // fail toStrictEqualX = T>(expected: NoInferX>): void;toThrow(expected?: unknown): void;Asserts that a function throws an error.If expected is a string or RegExp, it will check the message property.If expected is an Error object, it will check the name and message properties.If expected is an Error constructor, it will check the class of the Error.If expected is not provided, it will check if anything has thrown.@param expectedthe expected error, error message, or error patternfunction fail() { throw new Error("Oops!"); } expect(fail).toThrow("Oops!"); expect(fail).toThrow(/oops/i); expect(fail).toThrow(Error); expect(fail).toThrow(); toThrowError(expected?: unknown): void;Asserts that a function throws an error.If expected is a string or RegExp, it will check the message property.If expected is an Error object, it will check the name and message properties.If expected is an Error constructor, it will check the class of the Error.If expected is not provided, it will check if anything has thrown.@param expectedthe expected error, error message, or error patternfunction fail() { throw new Error("Oops!"); } expect(fail).toThrowError("Oops!"); expect(fail).toThrowError(/oops/i); expect(fail).toThrowError(Error); expect(fail).toThrowError(); toThrowErrorMatchingInlineSnapshot(value?: string): void;Asserts that a function throws an error matching the most recent snapshot.@param valueThe latest automatically-updated snapshot value.function fail() { throw new Error("Oops!"); } expect(fail).toThrowErrorMatchingInlineSnapshot(); expect(fail).toThrowErrorMatchingInlineSnapshot(`"Oops!"`); toThrowErrorMatchingSnapshot(hint?: string): void;Asserts that a function throws an error matching the most recent snapshot.function fail() { throw new Error("Oops!"); } expect(fail).toThrowErrorMatchingSnapshot(); expect(fail).toThrowErrorMatchingSnapshot("This one should say Oops!"); interface MatchersBuiltinT = unknown>fail: (message?: string) => voidAssertion which fails.expect().fail(); expect().fail("message is optional"); expect().not.fail(); expect().not.fail("hi"); not: Matchersunknown>Negates the result of a subsequent assertion. If you know how to test something, .not lets you test its opposite.expect(1).not.toBe(0); expect(null).not.toBeNull(); pass: (message?: string) => voidAssertion which passes.expect().pass(); expect().pass("message is optional"); expect().not.pass(); expect().not.pass("hi"); rejects: Matchersunknown>Expects the value to be a promise that rejects.expect(Promise.reject("error")).rejects.toBe("error"); resolves: MatchersAwaitedT>>Expects the value to be a promise that resolves.expect(Promise.resolve(1)).resolves.toBe(1); lastCalledWith(...expected: unknown[]): void;Ensure that a mock function is called with specific arguments for the nth call.nthCalledWith(n: number,...expected: unknown[]): void;Ensure that a mock function is called with specific arguments for the nth call.toBe(expected: T): void;Asserts that a value equals what is expected.For non-primitive values, like objects and arrays, use toEqual() instead.For floating-point numbers, use toBeCloseTo() instead.@param expectedthe expected valueexpect(100 + 23).toBe(123); expect("d" + "og").toBe("dog"); expect([123]).toBe([123]); // fail, use toEqual() expect(3 + 0.14).toBe(3.14); // fail, use toBeCloseTo() // TypeScript errors: expect("hello").toBe(3.14); // typescript error + fail expect("hello").toBenumber>(3.14); // no typescript error, but still fails toBeX = T>(expected: NoInferX>): void;toBeArray(): void;Asserts that a value is a array.expect([1]).toBeArray(); expect(new Array(1)).toBeArray(); expect({}).not.toBeArray(); toBeArrayOfSize(size: number): void;Asserts that a value is a array of a certain length.expect([]).toBeArrayOfSize(0); expect([1]).toBeArrayOfSize(1); expect(new Array(1)).toBeArrayOfSize(1); expect({}).not.toBeArrayOfSize(0); toBeBoolean(): void;Asserts that a value is a boolean.expect(true).toBeBoolean(); expect(false).toBeBoolean(); expect(null).not.toBeBoolean(); expect(0).not.toBeBoolean(); toBeCalled(): void;Ensures that a mock function is called an exact number of times.toBeCalledTimes(expected: number): void;Ensure that a mock function is called with specific arguments.toBeCalledWith(...expected: unknown[]): void;Ensure that a mock function is called with specific arguments.toBeCloseTo(expected: number,numDigits?: number): void;Asserts that value is close to the expected by floating point precision.For example, the following fails because arithmetic on decimal (base 10) values often have rounding errors in limited precision binary (base 2) representation.@param expectedthe expected value@param numDigitsthe number of digits to check after the decimal point. Default is 2expect(0.2 + 0.1).toBe(0.3); // fails Use `toBeCloseTo` to compare floating point numbers for approximate equality. toBeDate(): void;Asserts that a value is a Date object.To check if a date is valid, use toBeValidDate() instead.expect(new Date()).toBeDate(); expect(new Date(null)).toBeDate(); expect("2020-03-01").not.toBeDate(); toBeDefined(): void;Asserts that a value is defined. (e.g. is not undefined)expect(true).toBeDefined(); expect(undefined).toBeDefined(); // fail toBeEmpty(): void;Asserts that a value is empty.expect("").toBeEmpty(); expect([]).toBeEmpty(); expect({}).toBeEmpty(); expect(new Set()).toBeEmpty(); toBeEmptyObject(): void;Asserts that a value is an empty object.expect({}).toBeEmptyObject(); expect({ a: 'hello' }).not.toBeEmptyObject(); toBeEven(): void;Asserts that a number is even.expect(2).toBeEven(); expect(1).not.toBeEven(); toBeFalse(): void;Asserts that a value is false.expect(false).toBeFalse(); expect(true).not.toBeFalse(); expect(0).not.toBeFalse(); toBeFalsy(): void;Asserts that a value is "falsy".To assert that a value equals false, use toBe(false) instead.expect(true).toBeTruthy(); expect(1).toBeTruthy(); expect({}).toBeTruthy(); toBeFinite(): void;Asserts that a value is a number, and is not NaN or Infinity.expect(1).toBeFinite(); expect(3.14).toBeFinite(); expect(NaN).not.toBeFinite(); expect(Infinity).not.toBeFinite(); toBeFunction(): void;Asserts that a value is a function.expect(() => {}).toBeFunction(); toBeGreaterThan(expected: number | bigint): void;Asserts that a value is a number and is greater than the expected value.@param expectedthe expected numberexpect(1).toBeGreaterThan(0); expect(3.14).toBeGreaterThan(3); expect(9).toBeGreaterThan(9); // fail toBeGreaterThanOrEqual(expected: number | bigint): void;Asserts that a value is a number and is greater than or equal to the expected value.@param expectedthe expected numberexpect(1).toBeGreaterThanOrEqual(0); expect(3.14).toBeGreaterThanOrEqual(3); expect(9).toBeGreaterThanOrEqual(9); toBeInstanceOf(value: unknown): void;Asserts that the expected value is an instance of valueexpect([]).toBeInstanceOf(Array); expect(null).toBeInstanceOf(Array); // fail toBeInteger(): void;Asserts that a value is a number, and is an integer.expect(1).toBeInteger(); expect(3.14).not.toBeInteger(); expect(NaN).not.toBeInteger(); toBeLessThan(expected: number | bigint): void;Asserts that a value is a number and is less than the expected value.@param expectedthe expected numberexpect(-1).toBeLessThan(0); expect(3).toBeLessThan(3.14); expect(9).toBeLessThan(9); // fail toBeLessThanOrEqual(expected: number | bigint): void;Asserts that a value is a number and is less than or equal to the expected value.@param expectedthe expected numberexpect(-1).toBeLessThanOrEqual(0); expect(3).toBeLessThanOrEqual(3.14); expect(9).toBeLessThanOrEqual(9); toBeNaN(): void;Asserts that a value is NaN.Same as using Number.isNaN().expect(NaN).toBeNaN(); expect(Infinity).toBeNaN(); // fail expect("notanumber").toBeNaN(); // fail toBeNegative(): void;Asserts that a value is a negative number.expect(-3.14).toBeNegative(); expect(1).not.toBeNegative(); expect(NaN).not.toBeNegative(); toBeNil(): void;Asserts that a value is null or undefined.expect(null).toBeNil(); expect(undefined).toBeNil(); toBeNull(): void;Asserts that a value is null.expect(null).toBeNull(); expect(undefined).toBeNull(); // fail toBeNumber(): void;Asserts that a value is a number.expect(1).toBeNumber(); expect(3.14).toBeNumber(); expect(NaN).toBeNumber(); expect(BigInt(1)).not.toBeNumber(); toBeObject(): void;Asserts that a value is an object.expect({}).toBeObject(); expect("notAnObject").not.toBeObject(); expect(NaN).not.toBeObject(); toBeOdd(): void;Asserts that a number is odd.expect(1).toBeOdd(); expect(2).not.toBeOdd(); toBeOneOf(expected: IterableT>): void;Asserts that the value is deep equal to an element in the expected array.The value must be an array or iterable, which includes strings.@param expectedthe expected valueexpect(1).toBeOneOf([1,2,3]); expect("foo").toBeOneOf(["foo", "bar"]); expect(true).toBeOneOf(new Set([true])); toBeOneOfX = T>(expected: NoInferIterableX, any, any>>): void;toBePositive(): void;Asserts that a value is a positive number.expect(1).toBePositive(); expect(-3.14).not.toBePositive(); expect(NaN).not.toBePositive(); toBeString(): void;Asserts that a value is a string.expect("foo").toBeString(); expect(new String("bar")).toBeString(); expect(123).not.toBeString(); toBeSymbol(): void;Asserts that a value is a symbol.expect(Symbol("foo")).toBeSymbol(); expect("foo").not.toBeSymbol(); toBeTrue(): void;Asserts that a value is true.expect(true).toBeTrue(); expect(false).not.toBeTrue(); expect(1).not.toBeTrue(); toBeTruthy(): void;Asserts that a value is "truthy".To assert that a value equals true, use toBe(true) instead.expect(true).toBeTruthy(); expect(1).toBeTruthy(); expect({}).toBeTruthy(); toBeTypeOf(type: 'string' | 'number' | 'bigint' | 'boolean' | 'symbol' | 'undefined' | 'object' | 'function'): void;Asserts that a value matches a specific type.expect(1).toBeTypeOf("number"); expect("hello").toBeTypeOf("string"); expect([]).not.toBeTypeOf("boolean"); toBeUndefined(): void;Asserts that a value is undefined.expect(undefined).toBeUndefined(); expect(null).toBeUndefined(); // fail toBeValidDate(): void;Asserts that a value is a valid Date object.expect(new Date()).toBeValidDate(); expect(new Date(null)).not.toBeValidDate(); expect("2020-03-01").not.toBeValidDate(); toBeWithin(start: number,end: number): void;Asserts that a value is a number between a start and end value.@param startthe start number (inclusive)@param endthe end number (exclusive)toContain(expected: T extends IterableU, any, any> ? U : T): void;Asserts that a value contains what is expected.The value must be an array or iterable, which includes strings.@param expectedthe expected valueexpect([1, 2, 3]).toContain(1); expect(new Set([true])).toContain(true); expect("hello").toContain("o"); toContainX = T>(expected: NoInferX extends IterableU, any, any> ? U : X>): void;toContainAllKeys(expected: IfNeverThenElsekeyof T, PropertyKey>[]): void;Asserts that an object contains all the provided keys.The value must be an object@param expectedthe expected valueexpect({ a: 'hello', b: 'world' }).toContainAllKeys(['a','b']); expect({ a: 'hello', b: 'world' }).toContainAllKeys(['b','a']); expect({ 1: 'hello', b: 'world' }).toContainAllKeys([1,'b']); expect({ a: 'hello', b: 'world' }).not.toContainAllKeys(['c']); expect({ a: 'hello', b: 'world' }).not.toContainAllKeys(['a']); toContainAllKeysX = T>(expected: IfNeverThenElseNoInferkeyof X>, PropertyKey>[]): void;toContainAllValues(expected: unknown[]): void;Asserts that an object contain all the provided values.The value must be an object@param expectedthe expected valueconst o = { a: 'foo', b: 'bar', c: 'baz' }; expect(o).toContainAllValues(['foo', 'bar', 'baz']); expect(o).toContainAllValues(['baz', 'bar', 'foo']); expect(o).not.toContainAllValues(['bar', 'foo']); toContainAnyKeys(expected: IfNeverThenElsekeyof T, PropertyKey>[]): void;Asserts that an object contains at least one of the provided keys. Asserts that an object contains all the provided keys.The value must be an object@param expectedthe expected valueexpect({ a: 'hello', b: 'world' }).toContainAnyKeys(['a']); expect({ a: 'hello', b: 'world' }).toContainAnyKeys(['b']); expect({ a: 'hello', b: 'world' }).toContainAnyKeys(['b', 'c']); expect({ a: 'hello', b: 'world' }).not.toContainAnyKeys(['c']); toContainAnyKeysX = T>(expected: IfNeverThenElseNoInferkeyof X>, PropertyKey>[]): void;toContainAnyValues(expected: unknown[]): void;Asserts that an object contain any provided value.The value must be an object@param expectedthe expected valueconst o = { a: 'foo', b: 'bar', c: 'baz' }; expect(o).toContainAnyValues(['qux', 'foo']); expect(o).toContainAnyValues(['qux', 'bar']); expect(o).toContainAnyValues(['qux', 'baz']); expect(o).not.toContainAnyValues(['qux']); toContainEqual(expected: T extends IterableU, any, any> ? U : T): void;Asserts that a value contains and equals what is expected.This matcher will perform a deep equality check for members of arrays, rather than checking for object identity.@param expectedthe expected valueexpect([{ a: 1 }]).toContainEqual({ a: 1 }); expect([{ a: 1 }]).not.toContainEqual({ a: 2 }); toContainEqualX = T>(expected: NoInferX extends IterableU, any, any> ? U : X>): void;toContainKey(expected: IfNeverThenElsekeyof T, PropertyKey>): void;Asserts that an object contains a key.The value must be an object@param expectedthe expected valueexpect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKey('a'); expect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKey('b'); expect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKey('c'); expect({ a: 'foo', b: 'bar', c: 'baz' }).not.toContainKey('d'); toContainKeyX = T>(expected: IfNeverThenElseNoInferkeyof X>, PropertyKey>): void;toContainKeys(expected: IfNeverThenElsekeyof T, PropertyKey>[]): void;Asserts that an object contains all the provided keys.@param expectedthe expected valueexpect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKeys(['a', 'b']); expect({ a: 'foo', b: 'bar', c: 'baz' }).toContainKeys(['a', 'b', 'c']); expect({ a: 'foo', b: 'bar', c: 'baz' }).not.toContainKeys(['a', 'b', 'e']); toContainKeysX = T>(expected: IfNeverThenElseNoInferkeyof X>, PropertyKey>[]): void;toContainValue(expected: unknown): void;Asserts that an object contain the provided value.This method is deep and will look through child properties to find the expected value.The input value must be an object.@param expectedthe expected valueconst shallow = { hello: "world" }; const deep = { message: shallow }; const deepArray = { message: [shallow] }; const o = { a: "foo", b: [1, "hello", true], c: "baz" }; expect(shallow).toContainValue("world"); expect({ foo: false }).toContainValue(false); expect(deep).toContainValue({ hello: "world" }); expect(deepArray).toContainValue([{ hello: "world" }]); expect(o).toContainValue("foo", "barr"); expect(o).toContainValue([1, "hello", true]); expect(o).not.toContainValue("qux"); // NOT expect(shallow).not.toContainValue("foo"); expect(deep).not.toContainValue({ foo: "bar" }); expect(deepArray).not.toContainValue([{ foo: "bar" }]); toContainValues(expected: unknown[]): void;Asserts that an object contain the provided value.This is the same as toContainValue, but accepts an array of values instead.The value must be an object@param expectedthe expected valueconst o = { a: 'foo', b: 'bar', c: 'baz' }; expect(o).toContainValues(['foo']); expect(o).toContainValues(['baz', 'bar']); expect(o).not.toContainValues(['qux', 'foo']); toEndWith(expected: string): void;Asserts that a value ends with a string.@param expectedthe string to end withtoEqual(expected: T): void;Asserts that a value is deeply equal to what is expected.@param expectedthe expected valueexpect(100 + 23).toBe(123); expect("d" + "og").toBe("dog"); expect([456]).toEqual([456]); expect({ value: 1 }).toEqual({ value: 1 }); toEqualX = T>(expected: NoInferX>): void;toEqualIgnoringWhitespace(expected: string): void;Asserts that a value is equal to the expected string, ignoring any whitespace.@param expectedthe expected stringexpect(" foo ").toEqualIgnoringWhitespace("foo"); expect("bar").toEqualIgnoringWhitespace(" bar "); toHaveBeenCalled(): void;Ensures that a mock function is called.toHaveBeenCalledTimes(expected: number): void;Ensures that a mock function is called an exact number of times.toHaveBeenCalledWith(...expected: unknown[]): void;Ensure that a mock function is called with specific arguments.toHaveBeenLastCalledWith(...expected: unknown[]): void;Ensure that a mock function is called with specific arguments for the last call.toHaveBeenNthCalledWith(n: number,...expected: unknown[]): void;Ensure that a mock function is called with specific arguments for the nth call.toHaveLastReturnedWith(expected: unknown): void;Ensures that a mock function has returned a specific value on its last invocation. This matcher uses deep equality, like toEqual(), and supports asymmetric matchers.toHaveLength(length: number): void;Asserts that a value has a .length property that is equal to the expected length.@param lengththe expected lengthexpect([]).toHaveLength(0); expect("hello").toHaveLength(4); toHaveNthReturnedWith(n: number,expected: unknown): void;Ensures that a mock function has returned a specific value on the nth invocation. This matcher uses deep equality, like toEqual(), and supports asymmetric matchers.@param nThe 1-based index of the function call@param expectedThe expected return valuetoHaveProperty(keyPath: string | number | string | number[],value?: unknown): void;Asserts that a value has a property with the expected name, and value if provided.@param keyPaththe expected property name or path, or an index@param valuethe expected property value, if providedexpect(new Set()).toHaveProperty("size"); expect(new Uint8Array()).toHaveProperty("byteLength", 0); expect({ kitchen: { area: 20 }}).toHaveProperty("kitchen.area", 20); expect({ kitchen: { area: 20 }}).toHaveProperty(["kitchen", "area"], 20); toHaveReturned(): void;Ensures that a mock function has returned successfully at least once.A promise that is unfulfilled will be considered a failure. If the function threw an error, it will be considered a failure.toHaveReturnedTimes(times: number): void;Ensures that a mock function has returned successfully at times times.A promise that is unfulfilled will be considered a failure. If the function threw an error, it will be considered a failure.toHaveReturnedWith(expected: unknown): void;Ensures that a mock function has returned a specific value. This matcher uses deep equality, like toEqual(), and supports asymmetric matchers.toInclude(expected: string): void;Asserts that a value includes a string.For non-string values, use toContain() instead.@param expectedthe expected substringtoIncludeRepeated(expected: string,times: number): void;Asserts that a value includes a string {times} times.@param expectedthe expected substring@param timesthe number of times the substring should occurtoMatch(expected: string | RegExp): void;Asserts that a value matches a regular expression or includes a substring.@param expectedthe expected substring or pattern.expect("dog").toMatch(/dog/); expect("dog").toMatch("og"); toMatchInlineSnapshot(value?: string): void;Asserts that a value matches the most recent inline snapshot.@param valueThe latest automatically-updated snapshot value.expect("Hello").toMatchInlineSnapshot(); expect("Hello").toMatchInlineSnapshot(`"Hello"`); toMatchInlineSnapshot(propertyMatchers?: object,value?: string): void;Asserts that a value matches the most recent inline snapshot.@param propertyMatchersObject containing properties to match against the value.@param valueThe latest automatically-updated snapshot value.expect({ c: new Date() }).toMatchInlineSnapshot({ c: expect.any(Date) }); expect({ c: new Date() }).toMatchInlineSnapshot({ c: expect.any(Date) }, ` { "v": Any, } `); toMatchObject(subset: object): void;Asserts that an object matches a subset of properties.@param subsetSubset of properties to match with.expect({ a: 1, b: 2 }).toMatchObject({ b: 2 }); expect({ c: new Date(), d: 2 }).toMatchObject({ d: 2 }); toMatchSnapshot(hint?: string): void;Asserts that a value matches the most recent snapshot.@param hintHint used to identify the snapshot in the snapshot file.expect([1, 2, 3]).toMatchSnapshot('hint message'); toMatchSnapshot(propertyMatchers?: object,hint?: string): void;Asserts that a value matches the most recent snapshot.@param propertyMatchersObject containing properties to match against the value.@param hintHint used to identify the snapshot in the snapshot file.expect([1, 2, 3]).toMatchSnapshot(); expect({ a: 1, b: 2 }).toMatchSnapshot({ a: 1 }); expect({ c: new Date() }).toMatchSnapshot({ c: expect.any(Date) }); toSatisfy(predicate: (value: T) => boolean): void;Checks whether a value satisfies a custom condition.@param predicateThe custom condition to be satisfied. It should be a function that takes a value as an argument (in this case the value from expect) and returns a boolean.expect(1).toSatisfy((val) => val > 0); expect("foo").toSatisfy((val) => val === "foo"); expect("bar").not.toSatisfy((val) => val === "bun"); toStartWith(expected: string): void;Asserts that a value starts with a string.@param expectedthe string to start withtoStrictEqual(expected: T): void;Asserts that a value is deeply and strictly equal to what is expected.There are two key differences from toEqual():It checks that the class is the same.It checks that undefined values match as well.@param expectedthe expected valueclass Dog { type = "dog"; } const actual = new Dog(); expect(actual).toStrictEqual(new Dog()); expect(actual).toStrictEqual({ type: "dog" }); // fail toStrictEqualX = T>(expected: NoInferX>): void;toThrow(expected?: unknown): void;Asserts that a function throws an error.If expected is a string or RegExp, it will check the message property.If expected is an Error object, it will check the name and message properties.If expected is an Error constructor, it will check the class of the Error.If expected is not provided, it will check if anything has thrown.@param expectedthe expected error, error message, or error patternfunction fail() { throw new Error("Oops!"); } expect(fail).toThrow("Oops!"); expect(fail).toThrow(/oops/i); expect(fail).toThrow(Error); expect(fail).toThrow(); toThrowError(expected?: unknown): void;Asserts that a function throws an error.If expected is a string or RegExp, it will check the message property.If expected is an Error object, it will check the name and message properties.If expected is an Error constructor, it will check the class of the Error.If expected is not provided, it will check if anything has thrown.@param expectedthe expected error, error message, or error patternfunction fail() { throw new Error("Oops!"); } expect(fail).toThrowError("Oops!"); expect(fail).toThrowError(/oops/i); expect(fail).toThrowError(Error); expect(fail).toThrowError(); toThrowErrorMatchingInlineSnapshot(value?: string): void;Asserts that a function throws an error matching the most recent snapshot.@param valueThe latest automatically-updated snapshot value.function fail() { throw new Error("Oops!"); } expect(fail).toThrowErrorMatchingInlineSnapshot(); expect(fail).toThrowErrorMatchingInlineSnapshot(`"Oops!"`); toThrowErrorMatchingSnapshot(hint?: string): void;Asserts that a function throws an error matching the most recent snapshot.function fail() { throw new Error("Oops!"); } expect(fail).toThrowErrorMatchingSnapshot(); expect(fail).toThrowErrorMatchingSnapshot("This one should say Oops!"); interface TestT extends ReadonlyArrayunknown>>Runs a test.test("can check if using Bun", () => { expect(Bun).toBeDefined(); }); test("can make a fetch() request", async () => { const response = await fetch("https://example.com/"); expect(response.ok).toBe(true); }); test("can set a timeout", async () => { await Bun.sleep(100); }, 50); // or { timeout: 50 } concurrent: TestT>Runs the test concurrently with other concurrent tests.failing: TestT>Marks this test as failing.Use test.failing when you are writing a test and expecting it to fail. These tests will behave the other way normal tests do. If failing test will throw any errors then it will pass. If it does not throw it will fail.test.failing is very similar to test.todo except that it always runs, regardless of the --todo flag.only: TestT>Skips all other tests, except this test.serial: TestT>Forces the test to run serially (not in parallel), even when the --concurrent flag is used.skip: TestT>Skips this test.todo: TestT>Marks this test as to be written or to be fixed.These tests will not be executed unless the --todo flag is passed. With the flag, if the test passes, the test will be marked as fail in the results; you will have to remove the .todo or check that your test is implemented correctly.concurrentIf(condition: boolean): TestT>;Runs the test concurrently with other concurrent tests, if condition is true.@param conditionif the test should run concurrentlyeachT extends unknown[]>(table: readonly T[]): TestT>;eachT>(table: T[]): Test[T]>;failingIf(condition: boolean): TestT>;Marks this test as failing, if condition is true.@param conditionif the test should be marked as failingif(condition: boolean): TestT>;Runs this test, if condition is true.This is the opposite of test.skipIf().@param conditionif the test should runserialIf(condition: boolean): TestT>;Forces the test to run serially (not in parallel), if condition is true. This applies even when the --concurrent flag is used.@param conditionif the test should run seriallyskipIf(condition: boolean): TestT>;Skips this test, if condition is true.@param conditionif the test should be skippedtodoIf(condition: boolean): TestT>;Marks this test as to be written or to be fixed, if condition is true.@param conditionif the test should be marked TODOinterface TesterContextequals: EqualsFunctioninterface TestOptionsrepeats?: numberSets the number of times to repeat the test, regardless of whether it passed or failed.retry?: numberSets the number of times to retry the test if it fails.timeout?: numberSets the timeout for the test in milliseconds.If the test does not complete within this time, the test will fail with:'Timeout: test {name} timed out after 5000ms' type AsymmetricMatcher = anyObject representing an asymmetric matcher obtained by an static call to expect like expect.anything(), expect.stringContaining("..."), etc.type CustomMatcherE, P extends any[]> = (this: MatcherContext, expected: E, ...matcherArguments: P) => MatcherResult | PromiseMatcherResult>type CustomMatchersDetected = OmitMatchersunknown>, keyof MatchersBuiltinunknown>> & OmitAsymmetricMatchers, keyof AsymmetricMatchersBuiltin>All non-builtin matchers and asymmetric matchers that have been type-registered through declaration mergingtype EqualsFunction = (a: unknown, b: unknown) => booleantype ExpectExtendMatchersM> = { [K in keyof M]: k extends keyof CustomMatchersDetected ? CustomMatcherunknown, ParametersCustomMatchersDetected[k]>> : CustomMatcherunknown, any[]> }If the types has been defined through declaration merging, enforce it. Otherwise enforce the generic custom matcher signature.type MockT extends (...args: any[]) => any> = JestMock.MockT>type Tester = (this: TesterContext, a: any, b: any, customTesters: Tester[]) => boolean | undefinedCustom equality testerResources
ReferenceDocsGuidesDiscordMerch StoreGitHubBlogToolkit
RuntimePackage managerTest runnerBundlerPackage runnerProject
Bun 1.0Bun 1.1Bun 1.2Bun 1.3RoadmapContributingLicenseBaked with ❤️ in San FranciscoWe're hiring →智能索引记录
-
2026-02-28 15:44:18
综合导航
成功
标题:Official Site of the National Hockey League NHL.com
简介:The official National Hockey League website including news,
-
2026-02-27 14:42:46
综合导航
成功
标题:Will NAT Be Phased Out in the Age of IPv6? - Making Sense of the Infinite
简介:Will NAT Be Phased Out in the Age of IPv6? - Making Sense of
-
2026-02-28 13:19:03
综合导航
成功
标题:TX24/TX25 シリーズ (1.27mmピッチ基板対基板コネクタ) コネクタ メーカー JAE 日本航空電子工業
简介:日本航空電子工業株式会社(JAE)のTX24/TX25 シリーズ (1.27mmピッチ基板対基板コネクタ)がご覧いただけ
-
2026-02-28 01:00:45
图片素材
成功
标题:手机网站大全观看建筑工程网络图图片-北京孤凡电子商务有限公司
简介:手机网站大全观看,建筑工程网络图图片,网站几个模板最好,编辑网站的软件【2025网络安全趋势】从小白到专家#xff1a;
-
2026-02-28 09:50:45
综合导航
成功
标题:Melissa Deegan W1M
简介:Melissa Deegan is a Client Services Executive at W1M, provid
-
2026-02-28 01:56:57
游戏娱乐
成功
标题:游戏图片_纵览出彩的游戏世界_3DM图片
简介:游戏世界给我们带来了一幅又一幅精彩的画面,3DM游戏图片频道将这些出彩的画面进行收集整理,让每一位来3DM的玩家都能够找
-
2026-02-28 13:02:47
综合导航
成功
标题:Test and Measurement Equipment Tektronix
简介:Tektronix has over 70 years of experience designing Test and
-
2026-02-27 15:32:41
综合导航
成功
标题:Schaeffler Germany
简介:Schaeffler has been driving forward groundbreaking invention
-
2026-02-27 15:18:23
综合导航
成功
标题:Vi fejrer SEED: Et årtis opdagelse og innovation hos EA
简介:I anledning af SEED’s 10-års jubilæum fremhæver vi teknologi
-
2026-02-28 16:42:16
综合导航
成功
标题:Jakub Kopczak Fish & Richardson
简介:Jakub Kopczak is a European and German patent attorney as we
-
2026-02-27 19:05:21
金融理财
成功
标题:金先生理财(金先生文化传播有限公司)_火必 Huobi交易所
简介:今天给各位分享金先生理财的知识,其中也会对金先生文化传播有限公司进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站
-
2026-02-28 13:20:07
综合导航
成功
标题:Law.com The Premier Source for Global Legal News & Analysis
简介:Law.com delivers news, insights and resources that allow leg
-
2026-02-28 01:46:36
综合导航
成功
标题:Education - Apple (CA)
简介:Apple technology and resources empower every kind of educato
-
2026-02-28 15:26:55
实用工具
成功
标题:组词网_在线组词_古汉语词典_词语查询
简介:古汉语词典组词网,在线组词收录词语近三十六万条,词语查询提供在线组词近义词,反义词,名词,动词,形容词,副词等多音字组词
-
2026-02-28 15:52:02
综合导航
成功
标题:TUP Warehouse Management Solutions - Willkommen
简介:TUP bietet Ihnen individuell abgestimmte, schlanke und proze
-
2026-02-28 16:16:06
综合导航
成功
标题:AE Festival Crossbody Bag American Eagle
简介:Magasinez à American Eagle Outfitters pour y trouver des jea
-
2026-02-27 23:13:47
视频影音
成功
标题:红颜祸水皇后娘娘太嚣张第47集红豆剧场_在线播放[高清流畅]_爽文短剧
简介:爽文短剧_红颜祸水皇后娘娘太嚣张剧情介绍:红颜祸水皇后娘娘太嚣张是由内详执导,内详等人主演的,于2025年上映,该古装讲
-
2026-02-27 23:28:22
综合导航
成功
标题:Paris V3 180mm 50 Degree Longboard Trucks - Purple Tide – CCS
简介:The Paris V3 Trucks are the perfect truck for anyone looking
-
2026-02-28 12:16:50
法律咨询
成功
标题:别墅网 - 别墅设计图
简介:别墅网专注提供最新别墅设计图纸、农村自建房全套施工图、3D别墅模型下载。涵盖现代、新中式、欧式等多种风格,专业设计师团队
-
2026-02-27 14:15:38
综合导航
成功
标题:Achieving the Joint Commission Gold Seal: GQR Healthcare · GQR
简介:Discover how GQR ensures compliance with the Joint Commissio
-
2026-02-28 00:41:22
综合导航
成功
标题:Pet Party Columns - Play The Free Game Online
简介:Pet Party Columns - click to play online. Pet Party Columns
-
2026-02-27 23:51:11
综合导航
成功
标题:18luck新利官网利app-你玩乐的的好帮手
简介:18luck新利官网专注于为玩家打造无忧的游戏环境。其官方应用程序以简洁流畅的设计、便捷的操作体验和丰富的游戏内容,成为
-
2026-02-27 14:20:52
综合导航
成功
标题:2017年陕西安全工程师考试时间已确定:10月28、29日-中级注册安全工程师-233网校
简介: 根据人力资源和社会保障部网发布的《关于2017年度专业技术人员资格考试计划及有关问题的通知》得知,陕西2017年安全
-
2026-02-27 15:19:29
综合导航
成功
标题:Schaeffler Germany
简介:Schaeffler has been driving forward groundbreaking invention
-
2026-02-28 12:27:00
综合导航
成功
标题:18luck新利官网利app-你玩乐的的好帮手
简介:18luck新利官网专注于为玩家打造无忧的游戏环境。其官方应用程序以简洁流畅的设计、便捷的操作体验和丰富的游戏内容,成为
-
2026-02-28 00:58:59
综合导航
成功
标题:18luck新利官网利app-你玩乐的的好帮手
简介:18luck新利官网专注于为玩家打造无忧的游戏环境。其官方应用程序以简洁流畅的设计、便捷的操作体验和丰富的游戏内容,成为
-
2026-02-27 18:52:45
综合导航
成功
标题:Name Server Archives - Making Sense of the Infinite
简介:Name Server Archives - Making Sense of the Infinite
-
2026-02-28 05:11:40
综合导航
成功
标题:10 raisons qui font que les filles sportives devraient toutes être casées
简介:Vous avez fait du running votre activité numéro 1 ? Tant mie
-
2026-02-28 01:02:29
汽车交通
成功
标题:玛莎拉蒂2025年销量11127辆,相比2023年暴跌约58% 发动机 汽车 法拉利 玛莎拉蒂 豪华品牌 跑车 轿车_手机网易网
简介:IT之家2月27日消息,在当今竞争空前激烈的汽车行业中,Stellantis旗下多个品牌面临严峻挑战,Stellanti
-
2026-02-28 16:39:01
宠物用品
成功
标题:哈尔滨哪里可以免费领养宠物狗? - 简书
简介:哈尔滨哪里可以免费领养宠物狗? 1. 哈尔滨市流浪动物救助站:官方渠道的可靠选择 哈尔滨市流浪动物救助站是目前本地较为正