Я пишу компоненты Vue, и я хотел бы вызвать исключение, если одно из свойств отсутствует или недействительно, также я хотел бы запретить Vue отображать шаблон и прекратить дальнейшую обработку до точки, где шаблон не будет обработан и окончательно добавлен в DOM.
Итак, вот уменьшенная версия одного из написанных мной компонентов:
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
@Component({
components: {}
})
export default class Checkbox extends Vue {
@Prop() public id?: string;
public mounted() {
if (this.id == null) {
this.$el.remove();
throw new Error("The id property is missing.");
}
}
}
</script>
Теперь это работает, но у него есть недостаток, потому что он требует удаления элемента из DOM, и это затрудняет тестирование по следующим причинам:
Когда компонент монтируется без идентификатора, он генерирует исключение, как я и предполагал.
Поскольку я выбрасываю исключение из метода ловушки жизненного цикла mounted
, я не могу смонтировать компонент и получить экземпляр, чтобы проверить, был ли удален элемент, и в некоторой степени это не имеет смысла для меня.
Вот фактический тест:
describe("When the id property is not assigned", () => {
it("then the checkbox should throw an exception", () => {
expect(() => shallowMount(Checkbox)).to.throw(); // works fine as expected.
});
it("then the checkbox should not exist", () => {
const wrapper: VueWrapper = shallowMount(Checkbox); // throws because we didn't provide any id, again, as expected.
/* This is what I would like to do but I don't get an instance back so obviously I can't do it. */
const checkbox = wrapper.vm.$el;
expect(checkbox).to.not.exist;
});
});
Я пытался вызвать исключение из метода created
ловушки жизненного цикла, а не mounted
, но это не мешает Vue добавить элемент в DOM.
Просто чтобы уточнить, я написал в тесте, что «это то, что я хотел бы сделать», но на самом деле я бы предпочел не удалять элемент вообще и предотвращать любую вставку визуализированного компонента в DOM, таким образом Мне даже не нужно было бы проверять это.