Skip to content

Commit da7aadc

Browse files
authored
feat(renderToString) Add renderToString method (#435)
1 parent 6ea4b10 commit da7aadc

29 files changed

+556
-131
lines changed

docs/en/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
* [API](api/README.md)
1919
* [mount](api/mount.md)
2020
* [shallow](api/shallow.md)
21+
* [renderToString](api/renderToString.md)
2122
* [Mounting Options](api/options.md)
2223
- [context](api/options.md#context)
2324
- [slots](api/options.md#slots)

docs/en/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* [API](api/README.md)
1515
* [mount](api/mount.md)
1616
* [shallow](api/shallow.md)
17+
* [renderToString](api/renderToString.md)
1718
* [Mounting Options](api/options.md)
1819
- [context](api/options.md#context)
1920
- [slots](api/options.md#slots)

docs/en/api/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
* [mount](./mount.md)
44
* [shallow](./shallow.md)
5+
* [renderToString](./renderToString.md)
56
* [Mounting Options](./options.md)
67
- [context](./options.md#context)
78
- [slots](./options.md#slots)

docs/en/api/renderToString.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# `renderToString(component {, options}])`
2+
3+
- **Arguments:**
4+
5+
- `{Component} component`
6+
- `{Object} options`
7+
- `{Object} context`
8+
- `{Array<Component|Object>|Component} children`
9+
- `{Object} slots`
10+
- `{Array<Componet|Object>|Component|String} default`
11+
- `{Array<Componet|Object>|Component|String} named`
12+
- `{Object} mocks`
13+
- `{Object|Array<string>} stubs`
14+
- `{Vue} localVue`
15+
16+
- **Returns:** `{string}`
17+
18+
- **Options:**
19+
20+
See [options](./options.md)
21+
22+
- **Usage:**
23+
24+
Renders a component to HTML.
25+
26+
`renderToString` uses [`vue-server-renderer`](https://ssr.vuejs.org/en/basic.html) under the hood, to render a component to HTML.
27+
28+
**Without options:**
29+
30+
```js
31+
import { renderToString } from '@vue/test-utils'
32+
import { expect } from 'chai'
33+
import Foo from './Foo.vue'
34+
35+
describe('Foo', () => {
36+
it('renders a div', () => {
37+
const renderedString = renderToString(Foo)
38+
expect(renderedString).toContain('<div></div>')
39+
})
40+
})
41+
```
42+
43+
**With Vue options:**
44+
45+
```js
46+
import { renderToString } from '@vue/test-utils'
47+
import { expect } from 'chai'
48+
import Foo from './Foo.vue'
49+
50+
describe('Foo', () => {
51+
it('renders a div', () => {
52+
const renderedString = renderToString(Foo, {
53+
propsData: {
54+
color: 'red'
55+
}
56+
})
57+
expect(renderedString).toContain('red')
58+
})
59+
})
60+
```
61+
62+
**Default and named slots:**
63+
64+
```js
65+
import { renderToString } from '@vue/test-utils'
66+
import { expect } from 'chai'
67+
import Foo from './Foo.vue'
68+
import Bar from './Bar.vue'
69+
import FooBar from './FooBar.vue'
70+
71+
describe('Foo', () => {
72+
it('renders a div', () => {
73+
const renderedString = renderToString(Foo, {
74+
slots: {
75+
default: [Bar, FooBar],
76+
fooBar: FooBar, // Will match <slot name="FooBar" />,
77+
foo: '<div />'
78+
}
79+
})
80+
expect(renderedString).toContain('<div></div>')
81+
})
82+
})
83+
```
84+
85+
**Stubbing global properties:**
86+
87+
```js
88+
import { renderToString } from '@vue/test-utils'
89+
import { expect } from 'chai'
90+
import Foo from './Foo.vue'
91+
92+
describe('Foo', () => {
93+
it('renders a div', () => {
94+
const $route = { path: 'http://www.example-path.com' }
95+
const renderedString = renderToString(Foo, {
96+
mocks: {
97+
$route
98+
}
99+
})
100+
expect(renderedString).toContain($route.path)
101+
})
102+
})
103+
```

flow/modules.flow.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@ declare module 'lodash/cloneDeep' {
1515
declare module 'vue-template-compiler' {
1616
declare module.exports: any;
1717
}
18+
19+
declare module 'vue-server-renderer' {
20+
declare module.exports: any;
21+
}

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
"vue-class-component": "^6.1.2",
8989
"vue-loader": "^13.6.2",
9090
"vue-router": "^3.0.1",
91+
"vue-server-renderer": "2.5.13",
9192
"vue-template-compiler": "^2.5.13",
9293
"vuetify": "^0.16.9",
9394
"vuex": "^3.0.1",
@@ -96,6 +97,7 @@
9697
},
9798
"peerDependencies": {
9899
"vue": "2.x",
100+
"vue-server-renderer": "2.x",
99101
"vue-template-compiler": "^2.x"
100102
},
101103
"dependencies": {

scripts/test-compat.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ set -e
44

55
test_version_number(){
66
echo "running unit tests with Vue $1"
7-
yarn add vue@$1 vue-template-compiler@$1
7+
yarn add vue@$1 vue-template-compiler@$1 vue-server-renderer@$1
88
yarn test:unit
99
yarn test:unit:karma
1010
}

src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import shallow from './shallow'
22
import mount from './mount'
3+
import renderToString from './renderToString'
34
import createLocalVue from './create-local-vue'
45
import TransitionStub from './components/TransitionStub'
56
import TransitionGroupStub from './components/TransitionGroupStub'
@@ -11,6 +12,7 @@ export default {
1112
config,
1213
mount,
1314
shallow,
15+
renderToString,
1416
TransitionStub,
1517
TransitionGroupStub,
1618
RouterLinkStub

src/lib/add-slots.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ function addSlots (vm: Component, slots: Object): void {
5454

5555
if (Array.isArray(slots[key])) {
5656
slots[key].forEach((slotValue) => {
57+
if (!isValidSlot(slotValue)) {
58+
throwError('slots[key] must be a Component, string or an array of Components')
59+
}
5760
addSlotToVm(vm, key, slotValue)
5861
})
5962
} else {

src/mount.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import errorHandler from './lib/error-handler'
1111
import { findAllVueComponentsFromVm } from './lib/find-vue-components'
1212

1313
Vue.config.productionTip = false
14-
Vue.config.errorHandler = errorHandler
1514
Vue.config.devtools = false
15+
Vue.config.errorHandler = errorHandler
1616

1717
export default function mount (component: Component, options: Options = {}): VueWrapper {
1818
// Remove cached constructor

0 commit comments

Comments
 (0)