Ember 單元測試

2018-01-06 18:10 更新

單元測試基礎

單元測試一般被用來測試一些小的代碼塊,并確保它正在做的是什么。與驗收測試不同的是,單元測試被限定在小范圍內(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');
 });
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號