diff --git a/tests/unit/d2-container-ghost-bs.spec.js b/tests/unit/d2-container-ghost-bs.spec.js
new file mode 100644
index 00000000..e8af6dc0
--- /dev/null
+++ b/tests/unit/d2-container-ghost-bs.spec.js
@@ -0,0 +1,65 @@
+import { mount } from '@vue/test-utils'
+import D2ContainerGhostBs from '@/components/d2-container/components/d2-container-ghost-bs.vue'
+
+describe('d2-container-ghost-bs.vue', () => {
+ // 存在且是Vue组件实例
+ it('is a vue instance', () => {
+ const wrapper = mount(D2ContainerGhostBs, {
+ slots: {
+ default: '
body
',
+ header: 'header
',
+ footer: 'footer
'
+ }
+ })
+
+ expect(wrapper.exists()).toBeTruthy()
+ expect(wrapper.isVueInstance()).toBeTruthy()
+ })
+
+ // 包含特定类名
+ it('contains specific classnames', () => {
+ const wrapper = mount(D2ContainerGhostBs, {
+ slots: {
+ default: 'body
',
+ header: 'header
',
+ footer: 'footer
'
+ }
+ })
+
+ expect(wrapper.is('.d2-container-ghost-bs')).toBeTruthy()
+ expect(wrapper.contains('.d2-container-ghost-bs__header')).toBeTruthy()
+ expect(wrapper.contains('.d2-container-ghost-bs__body')).toBeTruthy()
+ expect(wrapper.contains('.d2-container-ghost-bs__footer')).toBeTruthy()
+ })
+
+ // betterScrollOptions prop
+ it('has a property named \'betterScrollOptions\'', () => {
+ const wrapper = mount(D2ContainerGhostBs, {
+ slots: {
+ default: 'body
',
+ header: 'header
',
+ footer: 'footer
'
+ },
+ propsData: {
+ betterScrollOptions: {}
+ }
+ })
+
+ expect(wrapper.props().betterScrollOptions).toEqual({})
+ })
+
+ // 渲染slot
+ it('has one or more slots', () => {
+ const wrapper = mount(D2ContainerGhostBs, {
+ slots: {
+ default: 'body
',
+ header: 'header
',
+ footer: 'footer
'
+ }
+ })
+
+ expect(wrapper.text()).toMatch('header')
+ expect(wrapper.text()).toMatch('body')
+ expect(wrapper.text()).toMatch('footer')
+ })
+})
\ No newline at end of file
diff --git a/tests/unit/d2-container-ghost.spec.js b/tests/unit/d2-container-ghost.spec.js
new file mode 100644
index 00000000..247e1e57
--- /dev/null
+++ b/tests/unit/d2-container-ghost.spec.js
@@ -0,0 +1,54 @@
+import { mount } from '@vue/test-utils'
+import D2ContainerGhost from '@/components/d2-container/components/d2-container-ghost.vue'
+
+describe('d2-container-ghost.vue', () => {
+ // 存在且是Vue组件实例
+ it('is a vue instance', () => {
+ const wrapper = mount(D2ContainerGhost)
+
+ expect(wrapper.exists()).toBeTruthy()
+ expect(wrapper.isVueInstance()).toBeTruthy()
+ })
+
+ // 包含特定类名
+ it('contains specific classnames', () => {
+ const wrapper = mount(D2ContainerGhost, {
+ slots: {
+ default: 'body
',
+ header: 'header
',
+ footer: 'footer
'
+ }
+ })
+
+ expect(wrapper.is('.d2-container-ghost')).toBeTruthy()
+ expect(wrapper.contains('.d2-container-ghost__header')).toBeTruthy()
+ expect(wrapper.contains('.d2-container-ghost__body')).toBeTruthy()
+ expect(wrapper.contains('.d2-container-ghost__footer')).toBeTruthy()
+ })
+
+ // 节流间隔prop
+ it('has a property named \'scrollDelay\'', () => {
+ const wrapper = mount(D2ContainerGhost, {
+ propsData: {
+ scrollDelay: 30
+ }
+ })
+
+ expect(wrapper.props().scrollDelay).toEqual(30)
+ })
+
+ // 渲染slot
+ it('has one or more slots', () => {
+ const wrapper = mount(D2ContainerGhost, {
+ slots: {
+ default: 'body
',
+ header: 'header
',
+ footer: 'footer
'
+ }
+ })
+
+ expect(wrapper.text()).toMatch('header')
+ expect(wrapper.text()).toMatch('body')
+ expect(wrapper.text()).toMatch('footer')
+ })
+})