Не удается получить доступ к методу в компоненте одного файла Vue с помощью Jest при использовании

#vue.js #jestjs #vuejs3 #vue-composition-api #vue-jest

Вопрос:

Я хотел бы протестировать конкретные методы в своих компонентах Vue с одним файлом, используя Jest. Я использую Vue 3 с API композиции, и я хотел бы использовать этот <script setup> подход, но, похоже, это предотвращает это.

Это работает:

Компонент:

 <script>
export default {
  setup() {
    const testMethod = function(input) {
      return input   1;
    };
    return { testMethod };
  },
};
</script>
 

Тест:

 test('should be 2', () => {
  expect(TestComponent.setup().testMethod(1)).toBe(2); // success
});
 

Это не работает:

Компонент:

 <script setup>
const testMethod = function(input) {
  return input   1;
};
</script>
 

Тест:

 test('should be 2', () => {
  expect(TestComponent.setup().testMethod(1)).toBe(2); // TypeError: Cannot destructure property 'expose' of 'undefined' as it is undefined.
  expect(TestComponent.testMethod(1)).toBe(2); // TypeError: _testComponent.default.testMethod is not a function
});
 

Существует ли другой способ достичь этого или доступ к методам в компоненте невозможен с помощью этого <script setup> подхода?

Правка: В частности, ищу решения, которые не требуют монтажа гаджета с помощью чего-то вроде vue-тестов.

Комментарии:

1. Примечание: Я действительно пытался использовать defineExpose, но это, похоже, не помогло. v3.vuejs.org/api/sfc-script-setup.html#defineexpose

2. API композиции не подходит для тестирования реализации, вместо этого рассмотрите библиотеку тестирования Vue. То же самое было и в экосистеме React.

Ответ №1:

Привязки, объявленные в <script setup> , по умолчанию скрыты, но вы можете предоставить любой из них экземпляру компонента с помощью defineExpose() :

 // MyComponent.vue
<script setup>
const testMethod = function(input) {
  return input   1;
};

defineExpose({
  testMethod
})
</script>
 

Затем в своем тесте получите доступ к открытым привязкам через wrapper.vm (экземпляр компонента из @vue/test-utils оболочки).:

 // MyComponent.spec.js
import MyComponent from '@/components/MyComponent.vue'

test('should be 2', () => {
  const wrapper = shallowMount(MyComponent)
  expect(wrapper.vm.testMethod(1)).toBe(2)
})
 

ДЕМОНСТРАЦИЯ

Комментарии:

1. На самом деле я специально искал методы, которые не требовали монтажа компонента и @vue/test-utils . Вы не знаете, возможно ли это? Спасибо!

2. АФАИК, это невозможно. <script setup> Объявления закрыты по дизайну (на основе документов для defineExpose ). Обходным путем было бы переместить эти методы в файл библиотеки, который может быть импортирован вашим компонентом <script setup> и вашими тестами.

3. Это то, что я подозревал, спасибо!