【问题标题】:How do I change the timeout on a jasmine-node async spec如何更改 jasmine-node 异步规范的超时
【发布时间】:2012-03-26 06:32:26
【问题描述】:

如何在不使用 runs/waitsFor 块的情况下通过此测试?

it("cannot change timeout", function(done) {

     request("http://localhost:3000/hello", function(error, response, body){

         expect(body).toEqual("hello world");

         done();
     });
});

【问题讨论】:

    标签: node.js jasmine


    【解决方案1】:

    您可以(现在)按照Jasmine docs 直接在规范中设置它。

    describe("long asynchronous specs", function() {
    
        var originalTimeout;
    
        beforeEach(function() {
            originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
            jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
        });
    
        it("takes a long time", function(done) {
            setTimeout(function() {
                done();
            }, 9000);
        });
    
        afterEach(function() {
            jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
        });
    });
    

    【讨论】:

    • 是的,更改 jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; 的值对我来说是成功的,因为我使用 Jasmine + Jest 从头开始​​构建了一个全新的设置。它按预期工作。
    • 我同意 @willydee,在使用 cloudinary 运行测试时遇到问题,这个小 sn-p 来救我了。
    • 值得注意的是,这可能必须在it 之前发生。在您进行测试时,done 似乎已经与DEFAULT_TIMEOUT_INTERVAL 之前的it 开始挂钩。
    【解决方案2】:

    为此功能发送拉取请求 (https://github.com/mhevery/jasmine-node/pull/142)

    it("cannot change timeout", function(done) {
    
      request("http://localhost:3000/hello", function(error, response, body){
    
         expect(body).toEqual("hello world");
    
         done();
      });
    
    }, 5000); // set timeout to 5 seconds
    

    【讨论】:

    • 不要认为 PR 被合并了。
    【解决方案3】:

    要设置全局 Jasmine-Node 超时,请执行以下操作:

    jasmine.getEnv().defaultTimeoutInterval = timeoutYouWouldPrefer;// e.g. 15000 milliseconds
    

    感谢开发人员 Gabe Hicks 通过调试找出 .getEnv() 部分,尽管 README doc 中声称这是通过设置 jasmine.DEFAULT_TIMEOUT_INTERVAL 完成的错误信息。

    如果您只想为一个 it() 设置自定义超时,您可以尝试将超时(毫秒)作为第三个参数(在字符串语句和函数之后)传递。有一个这样做的例子here,但我不确定如果自定义超时时间长于 Jasmine 的默认值会发生什么。我预计它会失败。

    【讨论】:

    • 对于 2014 年偶然发现此答案的任何人的更新:对于 Jasmine 2 设置 jasmine.DEFAULT_TIMEOUT_INTERVAL 有效。
    • 它适用于使用 Jest + Jasmine 的全新设置。我刚刚在用于所有测试的全局配置文件中添加了jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;,它按预期工作。
    【解决方案4】:

    看起来您现在可以将其添加为 it 函数的最后一个参数:

    describe('my test', function(){
        it('works', function(done){
            somethingAsync().then(done);
        }, 10000); // changes to 10 seconds
    });
    

    【讨论】:

      【解决方案5】:

      在 Angular 中,将其放在描述块之外:

      jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
      

      这适用于 .spec.ts 文件中的所有测试

      【讨论】:

        【解决方案6】:

        放在describe声明之后:

        describe("A saves to DB", function() {
            jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
        

        【讨论】:

          【解决方案7】:

          在对我有用的帮助文件上添加:jasmine.DEFAULT_TIMEOUT_INTERVAL = yourTime;

          【讨论】:

            【解决方案8】:

            就我而言,我有多个测试用例,当我使用上述解决方案时,我正在使用:

                beforeEach(function() {
                    originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
                    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
                });
            

            DEFAULT_TIMEOUT_INTERVAL 在第一个测试用例中没有更新,所以我不得不添加这个:

              beforeAll(() => {
                jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
              })
            

            到我的代码成功运行所有测试。

            【讨论】:

              【解决方案9】:

              为什么不监视setTimeout()

              类似:

              var spy = spyOn(window, 'setTimeout').andCallFake(function (func, timeout) {
                  expect(timeout).toEqual(2500);
                  func();
              });
              
              setTimeOut(function () { ... }, 2500);
              expect(spy).toHaveBeenCalled();
              

              【讨论】:

              • 谢谢。这些是集成测试,node.js 正在调用通常很慢的外部服务。
              • 这太棒了,它可以在不让测试等待实际超时的情况下测试超时
              • 以这种方式我们不锻炼时间的流逝,并立即调用 fn,而原始从未在下一个循环之前调用它。
              【解决方案10】:

              要对所有测试(在 e2e 或集成测试的情况下)全局执行此操作,您可以使用帮助程序。

              正确配置的帮助文件应在测试执行之前加载,并允许您全局更改 DEFAULT_TIMEOUT_INTERVAL:

              spec/support/jasmine.json

              {
                  ...
                  "helpers": [
                      "/path/to/helpers/**/*.ts"
                  ]
              }
              

              helpers/timeout.ts

              jasmine.DEFAULT_TIMEOUT_INTERVAL = 300000;
              

              【讨论】:

              • 他们要求的是 nodejs,而不是 typescript。
              • @MatejVoboril 同样适用于js,只需将文件扩展名改为.js...
              【解决方案11】:

              在以下文件中将 j$.DEFAULT_TIMEOUT_INTERVAL 更改为 10000:npm\node_modules\jasmine-core\lib\jasmine-core

              【讨论】:

              • 对于每次运行测试都安装库的场景没有成效。例如:- 在云上运行 CI。
              猜你喜欢
              • 1970-01-01
              • 2014-02-21
              • 2014-09-23
              • 2019-10-31
              • 1970-01-01
              • 1970-01-01
              • 2013-06-27
              • 1970-01-01
              • 2017-07-24
              相关资源
              最近更新 更多