Ember 單元測(cè)試

2018-01-06 18:10 更新

單元測(cè)試基礎(chǔ)

單元測(cè)試一般被用來(lái)測(cè)試一些小的代碼塊,并確保它正在做的是什么。與驗(yàn)收測(cè)試不同的是,單元測(cè)試被限定在小范圍內(nèi)并且不需要Emeber程序運(yùn)行。

與Ember基本對(duì)象一樣的,創(chuàng)建單元測(cè)試也只需要繼承Ember.Object即可。然后在代碼塊內(nèi)編寫(xiě)具體的測(cè)試內(nèi)容,比如控制器、組件。每個(gè)測(cè)試就是一個(gè)Ember.Object實(shí)例對(duì)象,你可以設(shè)置對(duì)象的狀態(tài),運(yùn)行斷言。通過(guò)下面的例子,讓我們一起看看測(cè)試如何使用。

測(cè)試計(jì)算屬性

創(chuàng)建一個(gè)簡(jiǎn)單的實(shí)例,實(shí)例內(nèi)包含一個(gè)計(jì)算屬性computedFoo,此計(jì)算屬性依賴普通屬性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}`;
  })
});

在測(cè)試中,我們建立一個(gè)實(shí)例,然后更新屬性foo的值(這個(gè)操作會(huì)觸發(fā)計(jì)算屬性computedFoo,使其自動(dòng)更新),然后給出一個(gè)符合預(yù)期的斷言:

//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');  //設(shè)置屬性foo的值
  assert.equal(someThing.get('computedFoo'), 'computed baz');  //斷言,判斷計(jì)算屬性值是否相等于computed baz
});

例子中使用了moduleFor,它是由Ember-Qunit提供的單元測(cè)試助手。這些測(cè)試助手為我們提供了很多便利,比如subject功能,它可以尋找并實(shí)例化測(cè)試所用的對(duì)象。同時(shí)你還可以在subject方法中自定義初始化的內(nèi)容,這些初始化的內(nèi)容可以是傳遞給主體功能的實(shí)例變量。比如在單元測(cè)試內(nèi)初始化屬性“foo”你可以這樣做:this.subject({foo: 'bar'});,那么單元測(cè)試在運(yùn)行時(shí)屬性foo的值就是bar。

測(cè)試對(duì)象方法

下面讓我們來(lái)看一下如何測(cè)試對(duì)象方法的邏輯。在本例中對(duì)象內(nèi)部有一個(gè)設(shè)置屬性(更新屬性foo值)值的方法testMethod

//app/models/some-thing.js


export default Ember.Object.extend({
  foo: 'bar',
  testMethod() {
    this.set('foo', 'baz');
  }
});

要對(duì)其進(jìn)行測(cè)試,我們先創(chuàng)建如下實(shí)例,然后調(diào)用testMethod方法,然后用斷言判斷方法的調(diào)用結(jié)果是否是正確的。

//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');
});

如果一個(gè)對(duì)象方法返回的是一個(gè)值,你可以很容易的給予斷言進(jìn)行判定是否正確。假設(shè)我們的對(duì)象擁有一個(gè)calc方法,方法的返回值是基于對(duì)象內(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}`;
  }
});

在測(cè)試中需要調(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');
});

測(cè)試觀察者

假設(shè)我們有一個(gè)對(duì)象,這個(gè)對(duì)象擁有一些屬性,并且有一個(gè)方法在監(jiān)測(cè)著這些屬性。

//app/models/some-thing.js


export default Ember.Object.extend({
  foo: 'bar'
  other: 'no',,
  doSomething: Ember.observer('foo', function() {
    this.set('other', 'yes');
  })
});

為了測(cè)試doSomething方法,我們創(chuàng)建一個(gè)SomeThing對(duì)象,更新foo屬性值,然后進(jìn)行斷言是否達(dá)到預(yù)期結(jié)果。

//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');
 });
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)