Jasmine 2.0:重构1.3的运行()和waitsFor()

tha*_*adk 21 javascript jasmine

最近发布的Jasmine 2.0删除了等待函数runs()Async Jasmine 1.3.

我有旧的1.3测试,我想转换到新的风格.

对于等待,在大多数情况下,似乎你可以写beforeEach()afterEach()仔细地获得相同的效果.

重现runs()简单执行包含的函数的最佳方法是什么?

我的第一次尝试:

runs(function() {
  expect(true).toBe(true);
}
Run Code Online (Sandbox Code Playgroud)

(function() {
  expect(true).toBe(true);
})()
Run Code Online (Sandbox Code Playgroud)

Ton*_*ony 30

可以在it()块中使用setTimeout.

it("is asynchronous", function(done) {
  var isItDone = false;
  $.ajax('/some/url').success(function() { isItDone = true; });

  setTimeout(function(){
    expect(isItDone).toBeTrue();
    done(); // call this to finish off the it block
  }, 500);

});
Run Code Online (Sandbox Code Playgroud)

但是,我发现这大大减慢了我的测试套件,所以我创建了自己的扩展,重新创建了waitsFor提供的轮询功能.

https://gist.github.com/abreckner/110e28897d42126a3bb9

  • 非常感谢,虽然可以使用beforeEach/afterEach的组合重新排列这个逻辑,并且它可以像上面演示的Gregg一样,这是一个非常干净的方法,可以快速从Jasmine 1.3到2.0的一对一转换 (3认同)
  • 当您需要轮询条件存在时(当您正在测试的代码不提供回调但是异步操作时),此解决方案仍然是必需的. (2认同)

Gre*_*egg 22

在jasmine 1.3和之前的版本中,如果你有一些异步代码,你需要等到它在完成下一部分测试之前完成之前,才需要runswaits/ waitsFor.在这种情况下,你会有类似的东西:

it("is asynchronous", function() {
    var isItDone = false;
    runs(function() {
        $.ajax('/some/url').success(function() { isItDone = true; });
    });

    waitsFor(function() {
        return isItDone;
    });

    runs(function() {
        // this won't run until the waitsFor returns true
    });
});
Run Code Online (Sandbox Code Playgroud)

茉莉花2.0移到使用done回调beforeEach,it以及afterEach如果他们做一些事情异步,你需要等待.

beforeEach(function(done) {
    $.ajax('/some/url').success(done);
});

it("is asynchronous", function() {
    // this won't run until the done callback is invoked from the beforeEach
});
Run Code Online (Sandbox Code Playgroud)

  • 如果你需要一个接一个地做两个异步事件,你需要两个`beforeEach`调用. (2认同)