Monday, May 20, 2024
192
rated 0 times [  193] [ 1]  / answers: 1 / hits: 15753  / 4 Years ago, wed, april 15, 2020, 12:00:00

THE SITUATION



I am trying to shallowMount a component, unsuccessfully.



The component makes use of $refs to read the height of a div. That value is read inside a computed property. Then in the mounted lifecycle I save that value in the store.



The logic itself is simple and works fine. But in the test suite, the mounting of the component breaks, because the $refs key is undefined.



To be clear: I don't intend to test the $refs, I just need to mount the component and move on doing actual unit-testing.



THE COMPONENT



This is the markup:



<div ref=tgmp>


I save the height of the div in a computed property:



computed: {
barH() {
return this.$refs.tgmp.clientHeight
}
}


And then, in the mounted lifecycle, I commit the value in the store:



this.$store.commit('setBarHeight', this.barH)


THE TEST



This is the test. I have omitted irrelevant stuff, like installing the store in the localVue.



beforeEach(() => {
wrapper = shallowMount(Bar, {
store,
})
})

test('is a Vue instance', () => {
expect(wrapper.isVueInstance()).toBeTruthy()
})


THE ERROR



Error in mounted hook: TypeError: Cannot read property 'clientHeight' of undefined


TypeError:



ATTEMPT



I have been trying searching anywhere for a solution, but couldn't find it.
I have tried to mock the $refs, but without success:



wrapper = shallowMount(ThePlayerBar, {
store,
mocks: {
$refs: {
tgmp: {
clientHeight: 600
}
}
}
})


THE QUESTION



How can I mount a component that makes us of $refs in the mounted lifecycle?


More From » unit-testing

 Answers
4

shallowMount is supposed to provide refs, so this.$refs.tgmp should be <div> element in case <div ref=tgmp> exists in the view on initial render.



$refs isn't supposed to be mocked because it's internal property and assigned on component initialization. It's computed property that relies on a ref, so it can be mocked if necessary because element height is expected to be 0 in JSDOM:



jest.spyOn(ThePlayerBar.options.computed, 'barH').mockReturnValue(600);


Or:



  wrapper = shallowMount(Bar, {
store,
computed: { barH: () => 600 }
})

[#51039] Tuesday, April 7, 2020, 4 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
sonja

Total Points: 541
Total Questions: 113
Total Answers: 114

Location: Anguilla
Member since Sun, Jan 29, 2023
1 Year ago
sonja questions
Mon, Nov 30, 20, 00:00, 4 Years ago
Sun, Oct 11, 20, 00:00, 4 Years ago
Thu, May 21, 20, 00:00, 4 Years ago
Sun, Nov 10, 19, 00:00, 5 Years ago
Mon, Aug 26, 19, 00:00, 5 Years ago
;