diff --git a/site/test-coverage.js b/site/test-coverage.js
index 2627522e..c1ebd127 100644
--- a/site/test-coverage.js
+++ b/site/test-coverage.js
@@ -35,7 +35,7 @@ module.exports = {
loading: { statements: '98.43%', branches: '96.07%', functions: '100%', lines: '98.3%' },
locale: { statements: '74.07%', branches: '62.5%', functions: '83.33%', lines: '75%' },
message: { statements: '100%', branches: '94.44%', functions: '100%', lines: '100%' },
- navbar: { statements: '12.9%', branches: '0%', functions: '0%', lines: '13.79%' },
+ navbar: { statements: '100%', branches: '96.15%', functions: '100%', lines: '100%' },
noticeBar: { statements: '6.38%', branches: '0%', functions: '0%', lines: '6.52%' },
overlay: { statements: '100%', branches: '100%', functions: '100%', lines: '100%' },
picker: { statements: '51.71%', branches: '29.69%', functions: '57.31%', lines: '52.51%' },
diff --git a/src/navbar/__tests__/navbar.test.tsx b/src/navbar/__tests__/navbar.test.tsx
new file mode 100644
index 00000000..1f499979
--- /dev/null
+++ b/src/navbar/__tests__/navbar.test.tsx
@@ -0,0 +1,115 @@
+import React from 'react';
+import { describe, it, expect, render, vi, fireEvent } from '@test/utils';
+import { AppIcon } from 'tdesign-icons-react';
+import Navbar from '../index';
+
+const prefix = 't';
+const name = `.${prefix}-navbar`;
+
+describe('Navbar', () => {
+ describe('props', () => {
+ it(': animation', () => {
+ const { container, rerender } = render();
+ expect(container.querySelector(`${name}--visible-animation`)).toBeTruthy();
+
+ rerender();
+ expect(container.querySelector(`${name}--visible-animation`)).toBeFalsy();
+ });
+
+ it(': capsule', () => {
+ const { container } = render(胶囊} />);
+ expect(container.querySelector('.custom-capsule')).toBeTruthy();
+ });
+
+ it(': fixed', () => {
+ const { container } = render();
+ expect(container.querySelector(`${name}--fixed`)).toBeTruthy();
+ });
+
+ it(': left', () => {
+ const leftText = '返回';
+ const { container, queryByText, rerender } = render();
+ expect(queryByText(leftText)).toBeInTheDocument();
+
+ rerender(} />);
+ expect(container.querySelector('.t-icon-app')).toBeTruthy();
+ });
+
+ it(': leftArrow', () => {
+ const { container } = render();
+ expect(container.querySelector(`${name}__left-arrow`)).toBeTruthy();
+ });
+
+ it(': placeholder', () => {
+ const { container } = render();
+ expect(container.querySelector(`${name}__placeholder`)).toBeTruthy();
+ });
+
+ it(': right', () => {
+ const rightText = '更多';
+ const { queryByText } = render();
+ expect(queryByText(rightText)).toBeInTheDocument();
+ });
+
+ it(': safeAreaInsetTop', () => {
+ const { container } = render();
+ expect(container.querySelector(`.${prefix}-safe-area-top`)).toBeTruthy();
+ });
+
+ it(': title', () => {
+ const title = '页面标题';
+ const { queryByText } = render();
+ expect(queryByText(title)).toBeInTheDocument();
+ });
+
+ it(': titleMaxLength', () => {
+ const title = '这是一个很长的标题内容';
+ const { container, rerender } = render();
+ expect(container.querySelector(`${name}__center-title`)).toHaveTextContent('这是一个很...');
+
+ rerender();
+ const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
+ render();
+ expect(consoleSpy).toHaveBeenCalledWith('titleMaxLength must be greater than 0');
+ consoleSpy.mockRestore();
+ });
+
+ it(': children', () => {
+ const children = '自定义标题';
+ const { queryByText } = render({children});
+ expect(queryByText(children)).toBeInTheDocument();
+ });
+
+ it(': visible', () => {
+ const { container, rerender } = render();
+ expect(container.querySelector(`${name}--visible-animation`)).toBeTruthy();
+
+ rerender();
+ expect(container.querySelector(`${name}--hide-animation`)).toBeTruthy();
+ });
+
+ it(': zIndex', () => {
+ const { container } = render();
+ const navbar = container.querySelector(name) as HTMLElement;
+ expect(navbar.style.zIndex).toBe('999');
+ });
+ });
+
+ describe('events', () => {
+ it(': onLeftClick', () => {
+ const handleLeftClick = vi.fn();
+ const { container } = render();
+ const leftElement = container.querySelector(`${name}__left`);
+ fireEvent.click(leftElement);
+ expect(handleLeftClick).toHaveBeenCalledTimes(1);
+ });
+
+ it(': onRightClick', () => {
+ const handleRightClick = vi.fn();
+ const { container } = render();
+ const rightElement = container.querySelector(`${name}__right`);
+ fireEvent.click(rightElement);
+ expect(handleRightClick).toHaveBeenCalledTimes(1);
+ });
+ });
+});