我最近开始从 jasmine 1.3 迁移到 2.0 并遇到了一些问题。
这是我的旧测试的样子:

it("should start heartbeat after successful login and stop heartbeat after logout", function () {
    runs(function () {
        auth.hbTimeout = 500;
        var loggedIn = auth.login("USERWITHSESSION", "xyz", {});
        expect(loggedIn).toBe(true);
        expect(auth.getAuthenticated()).toBe(true);
        expect(auth.user).toBeDefined();
        expect(auth.user.Session).toEqual(74790750);
        setTimeout(function () {
            auth.stopHeartbeat();
            auth.user.Session = 74790760;
        }, 2000);
    });
    waitsFor(function () {
        return auth.user.Session == 74790760;
    }, "The session-id should have been changed", 2600);
    runs(function () {
        auth.heartbeat();
        expect(auth.getAuthenticated()).toBe(false);
        expect(auth.user).not.toBeDefined();
        auth.login("USERWITHSESSION", "xyz", {});
        setTimeout(function () {
            auth.user.Session = 74790750;
        }, 500);
    });
    waitsFor(function () {
        return auth.user.Session == 74790750;
    }, "The session-id should have been changed back", 1100);
    runs(function () {
        setTimeout(function () {
            auth.logout();
        }, 2000);
    });
    waitsFor(function () {
        return auth.getAuthenticated() == false;
    });
    expect(auth.user).not.toBeDefined();
});
我想复制该部分直到第一个 waitsFor()。对于两秒超时,我尝试了 setTimout() 并将期望移动到 afterEach 中。
据我了解, Jasmine 应该等待两秒钟然后执行代码,但仍然期望总是错误并且测试失败。
我是这样做的:
 describe("this is a async nested describe",function(){

    afterEach(function(done){
        expect(auth.user.Session).toBe(74790760);
    });

    it("let's do this",function(){

       auth.hbTimeout = 500;
        var loggedIn = auth.login("USERWITHSESSION", "xyz", {});
        expect(loggedIn).toBe(true);
        expect(auth.getAuthenticated()).toBe(true);
        expect(auth.user).toBeDefined();
        expect(auth.user.Session).toEqual(74790750);


        setTimeout(function() {
            auth.stopHeartbeat();
            auth.user.Session = 74790760;
            done();
        },2000);
    });

});
有人可以给我一个提示吗?无论我做什么,即使我将超时设置为一分钟,测试仍然在相同的时间内达到预期。

最佳答案

您没有将 done 函数传递到您的 let's do this 规范中。 Jasmine 2.0 根据规范函数的 length 属性以同步或异步方式运行规范,因此无参数函数将始终同步运行。

下面的代码来自 Jasmine 的 GitHub ( /src/core/QueueRunner.js )。

for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) {
  var fn = fns[iterativeIndex];
  if (fn.length > 0) {
    return attemptAsync(fn);
  } else {
    attemptSync(fn);
  }
}

另外,不要忘记在 afterEach 函数中也调用 done(),如下所示:
afterEach(function(done){
    expect(auth.user.Session).toBe(74790760);
    done();
});

关于jasmine - 从 Jasmine 1.3 迁移到 2.0 的问题 done 和 SetTimeOut 的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22375772/

10-13 02:54