使用Jasmine和DS.FixtureAdapter测试Ember-data



我正在尝试使用DS.FixtureAdapter对ember-data(使用当前主)进行Jasmine测试。我已经尝试了下面代码的几十种变体(有或没有尝试创建Application名称空间)。我还进入了ember-data源,试图看看发生了什么,并引用了ember-data本身中的测试作为示例。

我还尝试了各种各样的Person.find(1),使用Ember.run块和Jasmine wait()。

无论我尝试什么,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')

无论我尝试什么,存储。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 ms内正确设置-当然这可能导致脆性测试Ember.run.later(this, function() {console.log('should = kyle: ', Em.get(kyle, 'firstName'));console.log('should = kim: ', Em.get(App. log)。金,"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。详情请参阅这篇文章:是否建议设置烬。对于单元测试,Testing = true ?

相关内容

  • 没有找到相关文章

最新更新