无法使用vue和moment将参数传递给茉莉花中的按钮方法

Unable to pass arguments to button methods in jasmine using vue and moment

我有一个 Vue 应用程序,我正在尝试使用 jasmine/karma 进行单元测试。下面是组件中的代码:

从数据库中使用 v-for=(data,index) 后,我在模板中设置 data.date

<p class="date">
  {{ dateFilter(data.date) }}
</p>

现在我可以测试给定数据的格式是否正确。我目前在规格文件中有这样的东西:

import { mount } from '@vue/test-utils';
import moment from 'moment'

it('should call method', () => {
  const selector = wrapper.find('date');
 
});

如何调用该方法并传递模拟参数来测试该方法?我们也可以导入moment js吗?

你一开始就不应该在那里使用方法。您应该使用 computed property 而不是

computed: {
    dateFilter() {
      return moment.unix(this.data.date).utc().format("HH:mm a");
    },
}

在模板中

 <p class="date">
      {{ dateFilter }}
 </p>

现在在测试中您可以更改 data.date 的值(我猜您将其作为道具传递)

import { mount } from '@vue/test-utils';
import moment from 'moment'

const wrapper = mount(YourComponent)


 it('should call method', () => {

      const localThis = { date: <date-here> }
      expect(wrapper.computed.numbers.call(localThis)).toBe(<experct-result-here>)
 
  });

更新

要“解决”需要传递参数的迭代元素的问题,Vue 方法是创建一个组件,例如。并将逻辑放入其中。它可以采用数据道具并像这样:

Parent.vue
<display-date v-for="(data,index)in allData" :key="data.id||index" :data-prop="data" />

然后在显示日期组件中,您可以使用之前建议的逻辑。请注意计算属性和方法之间的巨大差异。

享受编码吧!

测试日期是否以正确的格式呈现:

const wrapper = mount(MyComponent, {
  propsData: {
    // assuming component has `items` prop, used in:
    // <p class="date" v-for="data in items"> {{ dateFilter(data.date) }} </p>
    items: [
      {
        id: 100,
        date: new Date('2020-12-10T12:30:45-08:00') // 12:30pm GMT-8 === 4:30pm UTC
      }
    ]
  }
})

const dateEl = wrapper.find('.date') // find first dateElement with `date` class
expect(dateEl.text()).toEqual('16:30 pm')

直接测试组件方法,通过wrapper的vm property访问方法:

expect(wrapper.vm.dataFilter(new Date('2020-12-10T12:30:45-08:00'))).toEqual('16:30 pm')