Vueユニットテストに関するいくつかのピット
一、前に書いてください
この文章のコードはkama、mocha、chai、sinon-chaiを使って、Vueの実例的な属性に合わせてユニットテストを行います。
二、グローバルのコンポーネントのピット
私のg-inconはグローバル登録なので、g-inputコンポーネントを使う時はg-inconが直接使うので、テスト時のiconに関するコードは永遠に間違っています。
g-incon部分登録のコンポーネント
三、テスト中にイベントをクリックします。
シミュレーション私はap.vueでg-inputコンポーネントを使います。
value:{value:「hi」}最初のvalueはdefinePropertyです。
四、Vueのバージョン
ピットは次のコードから来ます。
templateオプションがない場合は、elは交替しません。
五、非同期テスト
それともこのコードですか?まず以下の二つのコンポーネントの関係をテストします。
createdとmountedフックから言えば、createElementとapendChildはjsコードで同期しています。二つのフックはそれぞれこの二つのコードの後で実行します。フックは非同期で実行します。
私たちはg-rowコンポーネントの中にmountedフックがありますので、非同期検査をしなければなりません。そうでないとnew Vueの後ですぐにテストを行います。フックはまだ実行されていません。
mocha非同期テスト
mochaはデフォルトで非同期を実行しないで、doneパラメータに参加して、done()を呼び出してもいいです。
六、ゴミの回収
各テストが終わったら、下記の二つのコードを書きます。は、ページ内のデータ を廃棄する。メモリに廃棄されたデータ jsはシングルスレッドですが、domスレッドがあります。
関数は大域変数div上のonlickによって引用されました。
div.remove()はページで削除しただけで、メモリから削除されませんでした。
ieはbugがあって、たとえこのようにすべて削除することができませんとしても、div.onlick=nullはできます。
ここでは、Vueユニットテストのいくつかのピットに関する記事を紹介します。Vueユニットのテスト内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。
この文章のコードはkama、mocha、chai、sinon-chaiを使って、Vueの実例的な属性に合わせてユニットテストを行います。
二、グローバルのコンポーネントのピット
私のg-inconはグローバル登録なので、g-inputコンポーネントを使う時はg-inconが直接使うので、テスト時のiconに関するコードは永遠に間違っています。
g-incon部分登録のコンポーネント
三、テスト中にイベントをクリックします。
シミュレーション私はap.vueでg-inputコンポーネントを使います。
<g-input v-model="message"></g-input>
new eventとdispatchの模擬事件を使ってコンポーネントの上で触発して、この事件は私達の実際の事件と異なっていますが、名前は同じで十分です。
it(" ", () => {
["change", "input", "focus", "blur"].forEach(eventName => {
vm = new Constructor({}).$mount();
const callback = sinon.fake();
vm.$on(eventName, callback);
let event = new Event(eventName);
Object.defineProperty(event, "target", {
value: { value: "hi" },
enumerable: true
});
let inputElement = vm.$el.querySelector("input");
inputElement.dispatchEvent(event);
expect(callback).to.have.been.calledWith("hi");
});
});
このコンポーネントのイベントのトリガをテストすると、カスタマイズされたイベントにtargetがないので、自分で記入してください。value:{value:「hi」}最初のvalueはdefinePropertyです。
四、Vueのバージョン
ピットは次のコードから来ます。
it(" gutter", function(done) {
Vue.component("g-row", Row);
Vue.component("g-col", Col);
const div = document.createElement("div");
document.body.appendChild(div);
div.innerHTML = `
<g-row gutter="20">
<g-col></g-col>
<g-col></g-col>
</g-row>`;
const vm = new Vue({
el: div
});
setTimeout(() => {
const row = vm.$el.querySelector(".row");
expect(getComputedStyle(row).marginRight).to.eq("-10px");
expect(getComputedStyle(row).marginLeft).to.eq("-10px");
const cols = vm.$el.querySelectorAll(".col");
expect(getComputedStyle(cols[0]).paddingRight).to.eq("10px");
expect(getComputedStyle(cols[1]).paddingLeft).to.eq("10px");
done();
vm.$el.remove();
vm.$destroy();
}, 0);
});
私は直接にtemplateコードを書き込みますので、デフォルトのimport Vue from「vue」はこのコードをコンパイルすることができません。import Vue from./。modules/vue/dist/vue.esm.jsは上から導入すればいいです。templateオプションがない場合は、elは交替しません。
五、非同期テスト
それともこのコードですか?まず以下の二つのコンポーネントの関係をテストします。
it(" gutter", function(done) {
Vue.component("g-row", Row);
Vue.component("g-col", Col);
const div = document.createElement("div");
document.body.appendChild(div);
div.innerHTML = `
<g-row gutter="20">
<g-col></g-col>
<g-col></g-col>
</g-row>`;
const vm = new Vue({
el: div
});
setTimeout(() => {
const row = vm.$el.querySelector(".row");
expect(getComputedStyle(row).marginRight).to.eq("-10px");
expect(getComputedStyle(row).marginLeft).to.eq("-10px");
const cols = vm.$el.querySelectorAll(".col");
expect(getComputedStyle(cols[0]).paddingRight).to.eq("10px");
expect(getComputedStyle(cols[1]).paddingLeft).to.eq("10px");
done();
vm.$el.remove();
vm.$destroy();
}, 0);
});
まず、なぜseTimeoutが必要ですか?createdとmountedフックから言えば、createElementとapendChildはjsコードで同期しています。二つのフックはそれぞれこの二つのコードの後で実行します。フックは非同期で実行します。
私たちはg-rowコンポーネントの中にmountedフックがありますので、非同期検査をしなければなりません。そうでないとnew Vueの後ですぐにテストを行います。フックはまだ実行されていません。
mocha非同期テスト
mochaはデフォルトで非同期を実行しないで、doneパラメータに参加して、done()を呼び出してもいいです。
六、ゴミの回収
各テストが終わったら、下記の二つのコードを書きます。
vm.$el.remove();
vm.$destroy();
二つの役割があります
var div = document. getElementById('xxx')
div.onclick = function() {
///code
}
setTimeout(function(){
div. remove()
}, 3000)
今から討論します。いつdiv上の関数が回収されますか?関数は大域変数div上のonlickによって引用されました。
div.remove()はページで削除しただけで、メモリから削除されませんでした。
var div = document. getElementById('xxx')
div.onclick = function() {
///code
}
setTimeout(function(){
div = mull
}, 3000)
この関数は削除されていません。関数はdomに書いてあります。div変数はdomオブジェクトを参照しただけです。
var div = document. getElementById('xxx')
div.onclick = function() {
///code
}
setTimeout(function(){
var div2 = document. getElementById('xxx')
}, 3000)
div=nullとdiv.removeは同時にすればいいです。それぞれメモリとdomから削除します。ieはbugがあって、たとえこのようにすべて削除することができませんとしても、div.onlick=nullはできます。
ここでは、Vueユニットテストのいくつかのピットに関する記事を紹介します。Vueユニットのテスト内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。