2014-03-12 118 views
3

我正在为QUnit中的Ember.js应用程序编写集成测试。在测试之前,我想通过向专门的测试API发出HTTP请求来播种一些测试数据。我使用jQuery.post发出POST请求,并使用Ember.RSVP.Promise.cast将jQuery承诺变为RSVP承诺。但是,它似乎从未解决。在下面的代码中,它只是挂起。字符串"STARTING"已打印,但不打印"DONE"也不打印"FAIL"在QUnit集成测试中无法解析RSVP.Promise

我也尝试创建一个新的RSVP承诺,如http://emberjs.com/api/classes/Ember.RSVP.Promise.html的“高级用法”部分中所述,无济于事(它也被绞死)。如果我不将jQuery承诺包装到RSVP Promise中,它确实会到达"DONE""FAIL"

为什么RSVP Promise没有解决?

function create_teacher() { 
    var url = "<%= testing_teacher_path %>"; 

    return Ember.RSVP.Promise.cast(
    Ember.$.post(
     url, 
     { 
     user: { 
      first_name: "John", 
      last_name: "Doe" 
      school: "EE3", 
      email: "[email protected]", 
      password: "password" 
     } 
     } 
    ) 
); 
} 

module("Teacher Dashboard", { 
    setup: function() { 
    console.log("STARTING"); 
    Ember.run(HstryEd, HstryEd.advanceReadiness); 
    }, 
    teardown: function() { 
    console.log("TEARING DOWN"); 
    HstryEd.reset(); 
    } 
}); 

asyncTest("Login", function() { 
    expect(1); 

    var teacher = create_teacher(); 
    teacher.then(function() { 
    console.log("DONE"); 
    ok(true, "done"); 
    start(); 
    }, 
    function() { 
    console.log("FAIL"); 
    ok(false, "fail"); 
    start(); 
    }); 
}); 

回答

2

它可能必须在测试模式下禁用Ember runloop。你有没有退房ic-ajaxhttps://github.com/instructure/ic-ajax它以Ember喜欢的形式为您提供承诺式jQuery ajax请求,即使在测试中也是如此。我在测试中解决了我的Ember runloop问题,迄今为止取得了很好的结果。

或者,您可以尝试将teacher.then(..包装在Ember.run中。

+0

使用ic-ajax做了窍门,谢谢! – yorbro