Как настроить таргетинг на первого дочернего элемента селектора при тестировании компонента с помощью jest

#javascript #vue.js #vuejs2 #jestjs #vue-test-utils

#javascript #vue.js #vuejs2 #jestjs #vue-test-utils

Вопрос:

Я пытаюсь написать тест для таргетинга, правильно ли передан prop по умолчанию в HTML с помощью jest и vue-test-utils . Кажется, я не могу найти свой целевой селектор. Я хочу иметь возможность проверить, что конкретный p тег содержит правильный текст. В этом случае, если передается имя prop, оно отображает это. Если нет, то функция по умолчанию отображает payTo значение по умолчанию.

Я пробовал несколько комбинаций привязки к оболочке, но безрезультатно.

 console.log(wrapper.html()) // presents all the page html
  
 console.log(wrapper.classes()) // array showing only one class ('.row-space-between')
  

Вот мой компонент:

 <template>
  <div class="row-space-between">
    <div>
      <h3>{{ $t('label.payTo') }}</h3>
      <p>{{ merchantName.payTo }}</p> // TARGET SELECTOR
    </div>
    <div class="align-right">
      <h3>{{ $t('label.estimatedTotal') }}</h3>
      <p>{{ amount }}</p>
    </div>
  </div>
</template>

<script>
export default {
  name: 'PayTo',
  props: {
    'merchant-name': {
      type: Object,
      // default: {} with type obj or arr default function is required
      default: function () {
        return { merchantName: {
          payTo: 'Order Total'
         }
       }
    },
    amount: {
      type: String,
      default: ''
    }
  }
}
  

И вот мой тест:

 describe('PayTo.vue', () => {
  let wrapper

  beforeEach(() => {
    wrapper = shallowMount(PayTo, {
      mocks: {
        $t
      },
      propsData: {
        merchantName: {
          payTo: 'foo-merchant-name'
        },
        amount: '$110.00'
      }
    })
  })
  it('[positive] should render correct contents', () => {
    // PayTo.props.merchantName.default()
    expect(wrapper.html()).toMatchSnapshot()
  })

  // The following two tests satisfy testing the default function in PayTo.vue props validation if not tested, coverage falls to zero

  // This test is meaningless until I can be more specific in targeting

  it('[positive] should display `AWS`', () => {
    wrapper.setProps({
      merchantName: {
        payTo: 'AWS'
      }
    })
    expect(wrapper.contains('p'))
  })

  it('[negative] should display `Order Total`', () => {
    wrapper.setProps({
      merchantName: {
        payTo: 'Order Total'
      }
    })
    console.log(wrapper.contains('div > p'))
    expect(wrapper.contains('p'))
  })
  

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

1. css: первый дочерний элемент?

2. Я пытался expect(wrapper.contains(div:first-child > p)) . Похоже, не работает.

Ответ №1:

Здесь можно было бы использовать :first-child псевдокласс:

 expect(wrapper.contains("div:first-child > p")).toBeTruthy()
  

Я бы также проверил, что текст в p соответствует ожидаемому значению:

 expect(wrapper.find("div:first-child > p").text()).toBe("Order Total")
  

Также обратите внимание, что значение по умолчанию вашего merchant-name prop не должно содержать другого merchantName ключа. В противном случае, когда этот реквизит не указан, payTo доступ к нему был бы осуществлен merchantName.merchantName.payTo .

 props: {
  "merchant-name": {
    type: Object,
    default: function() {
      return {
        // merchantName: {  // DON'T DO THIS
        //  payTo: "Order Total"
        // }

        payTo: "Order Total"
      }
    }
  },
}
  

Редактировать селекторы в @vue/test-utils