W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
單元測試一般被用來測試一些小的代碼塊,并確保它正在做的是什么。與驗收測試不同的是,單元測試被限定在小范圍內(nèi)并且不需要Emeber程序運行。
與Ember基本對象一樣的,創(chuàng)建單元測試也只需要繼承Ember.Object
即可。然后在代碼塊內(nèi)編寫具體的測試內(nèi)容,比如控制器、組件。每個測試就是一個Ember.Object
實例對象,你可以設置對象的狀態(tài),運行斷言。通過下面的例子,讓我們一起看看測試如何使用。
創(chuàng)建一個簡單的實例,實例內(nèi)包含一個計算屬性computedFoo
,此計算屬性依賴普通屬性foot
。
//app/models/somt-thing.js
export default Ember.Object.extend({
foo: 'bar',
computedFoo: Ember.compuuted('foo',function() {
const foo = this.get('foo');
return `computed ${foo}`;
})
});
在測試中,我們建立一個實例,然后更新屬性foo
的值(這個操作會觸發(fā)計算屬性computedFoo
,使其自動更新),然后給出一個符合預期的斷言
:
//tests/unit/models/some-thing-test.js
import {moduleFor, test} from 'ember-qunit';
moduleFor('model:some-thing', 'Unit | some thing', {
unit: true
});
test('should correctly concat foo', function(assert) {
const someThing = this.subject();
somtThing.set('foo', 'baz'); //設置屬性foo的值
assert.equal(someThing.get('computedFoo'), 'computed baz'); //斷言,判斷計算屬性值是否相等于computed baz
});
例子中使用了moduleFor
,它是由Ember-Qunit
提供的單元測試助手。這些測試助手為我們提供了很多便利,比如subject
功能,它可以尋找并實例化測試所用的對象。同時你還可以在subject
方法中自定義初始化的內(nèi)容,這些初始化的內(nèi)容可以是傳遞給主體功能的實例變量。比如在單元測試內(nèi)初始化屬性“foo”你可以這樣做:this.subject({foo: 'bar'});
,那么單元測試在運行時屬性foo
的值就是bar
。
下面讓我們來看一下如何測試對象方法的邏輯。在本例中對象內(nèi)部有一個設置屬性(更新屬性foo
值)值的方法testMethod
。
//app/models/some-thing.js
export default Ember.Object.extend({
foo: 'bar',
testMethod() {
this.set('foo', 'baz');
}
});
要對其進行測試,我們先創(chuàng)建如下實例,然后調(diào)用testMethod
方法,然后用斷言判斷方法的調(diào)用結果是否是正確的。
//tests/unit/models/some-thing-test.js
test('should update foo on testMethod', function(assert) {
const someThing = this.subject();
someThing.testMethod();
assert.equal(someThing.get('foo'), 'baz');
});
如果一個對象方法返回的是一個值,你可以很容易的給予斷言進行判定是否正確。假設我們的對象擁有一個calc
方法,方法的返回值是基于對象內(nèi)部的狀態(tài)值。代碼如下:
//app/models/some-thing.js
export default Ember.Object.extend({
count: 0,
calc() {
this.incrementProperty('count');
let count = this.get('count');
return `count: ${count}`;
}
});
在測試中需要調(diào)用calc
方法,并且斷言其返回值是否正確。
//tests/unit/models/some-thing-test.js
test('should return incremented count on calc', function(assert) {
const someThing = this.subject();
assert.equal(someThing.calc(), 'count: 1');
assert.equal(someThing.calc(), 'count: 2');
});
假設我們有一個對象,這個對象擁有一些屬性,并且有一個方法在監(jiān)測著這些屬性。
//app/models/some-thing.js
export default Ember.Object.extend({
foo: 'bar'
other: 'no',,
doSomething: Ember.observer('foo', function() {
this.set('other', 'yes');
})
});
為了測試doSomething
方法,我們創(chuàng)建一個SomeThing
對象,更新foo
屬性值,然后進行斷言是否達到預期結果。
//tests/unit/models/some-thing-test.js
test('should set other prop to yes when foo changes', function(assert) {
const someThing = this.subject();
someThing.set('foo', 'baz');
assert.equal(someThing.get('other'), 'yes');
});
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: