[英]Testing Ember-data w/Jasmine and DS.FixtureAdapter
我正在嘗試使用DS.FixtureAdapter對ember-data進行Jasmine測試(使用當前的master)。 我已經嘗試了以下代碼的幾十種變體(有和沒有嘗試創建一個Application命名空間)。 我也進入了ember-data源,試着看看發生了什么,並以ember-data本身的測試為例。
我也嘗試過使用Ember.run塊和Jasmine wait()的變體Person.find(1)。
無論我嘗試什么, store.find(Person, 'test')
返回一個結果,但是嘗試獲取其中一個屬性會導致null(測試斷言失敗)。 我沒看到什么? 謝謝你的幫助!
describe "a test", ->
store = null
Person = null
beforeEach ->
store = DS.Store.create
revision: 11
adapter: 'DS.FixtureAdapter'
Person = DS.Model.extend
firstName: DS.attr('string')
lastName: DS.attr('string')
age: DS.attr('number')
it "works or does it", ->
Person.FIXTURES = [{
id: 'test'
firstName: 'Kyle'
lastName: 'Stevens'
age: 30
}]
kyle = store.find(Person, 'test')
expect(Em.get(kyle, 'firstName')).toEqual('Kyle')
無論我嘗試什么,store.find(Person,'test')都會返回一個結果,但是嘗試獲取其中一個屬性會導致null(測試斷言失敗)。 我沒看到什么? 謝謝你的幫助!
這是一個時間問題。 當您調用store.find()
它會異步運行查詢並返回模型承諾。 這意味着當控制返回到測試時,查詢仍在運行(或計划運行),從而導致預期失敗。
這就是我們對ember的喜愛,這意味着你的應用程序可以將kyle視為數據存在,並相信當數據可用時,值將通過綁定自動更新。
當然,當它阻止你的測試通過時,所有這些魔法並不是那么好。 以下是一些替代方法:
1)注冊didLoad
回調
kyle = store.find(Person, 'test');
kyle.on('didLoad', function() {
console.log('should = kyle: ', Em.get(kyle, 'firstName'));
});
2)而不是didLoad
可以使用更多的黑盒測試方法,只需驗證名稱是否在調用find的100毫秒內設置屬性 - 當然這可能會導致脆弱的測試Ember.run.later(this,function(){console。 log('should = kyle:',Em.get(kyle,'firstName')); console.log('should = kim:',Em.get(App.kim,'firstName'));},100) ;
我相信在jasmine測試中,您可以將您的設置代碼包裝在runs()方法中,並使用waitsFor
來驗證該值是否已按預期設置:
waitsFor(function() {
return Em.get(kyle, 'firstName') == 'Kyle';
}, "x to be set to 5", 100);
有關工作(非茉莉花)示例,請參閱此JSBIN: http ://jsbin.com/apurac/4/edit
有關使用jasmine進行異步測試的提示,請參閱此文章: http : //blog.caplin.com/2012/01/17/testing-asynchronous-javascript-with-jasmine/
此外,請確保為所有測試設置Ember.testing = true
。 有關詳細信息,請參閱此SO帖子: 是否建議為單元測試設置Ember.testing = true?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.