2012-07-17 143 views
2

我使用jasmine来测试JavaScript代码。
JavaScript代码由使用requireJs加载的模块组成。
当我加载json文件使用json requirejs-plugins这需要text! plugin我看不到在web浏览器上的任何输出。
奇怪的是我也没有得到任何JavaScript错误。json RequireJS插件+茉莉花

这是我的代码(1)。

任何想法?

P.S .:
不确定,但也许问题是关于时间延迟。
如果我从本地获得该文件(time latency = 6ms),它可以工作。
如果我从远程服务器(time latency = 170 ms)获取文件(具有相同的本地内容),它将显示一个空白页面。
任何想法如何解决这个问题?


(1)

/*global define, window*/ 
(function() { 
    'use strict'; 
    var specUrl = './'; 
    define([ 
     'jasmine', 
     'jasmineHtml', 
     'jasmineJquery', 
     'json!json_data', // if I comment this line is ok, 
          // otherwise I get empty page with no error 
     specUrl + 'models/user.spec' 
    ], function (jasmine) { 
     var initialize = function() { 
      // some code 
     }; 

     return { 
      initialize: initialize 
     }; 
    }); 
}()); 

我看过的文档有关Asynchronous specs,但目前尚不清楚如何解决这个问题,但。有任何想法吗?
我做了一个非常简单的代码:(1)哪个起作用,(2)哪个不起作用,因为可能从服务器获取json_data需要大约250ms。

(1)

define([ 
     'appJasmine', 
//  'json!json_data', 
    ], function (app) { 
     app.initialize(); // it display data on browser 
    }); 

(2)

define([ 
     'appJasmine', 
     'json!json_data', 
    ], function (app) { 
     app.initialize(); // it does not display data on browser 
    }); 

回答

1

如果您在所有模块准备好之前运行execJasmine,您将获得空白页面。
所以你应该发布关于execJasmine调用的代码。
例如,如果运行这段代码:

 window.onload = function() { 
      if (currentWindowOnload) { 
       currentWindowOnload(); 
      } 
      execJasmine(); 
     }; 

你会得到一个空白页。

如果你运行这个,它应该工作。

 setTimeout(function() { 
      if (currentWindowOnload) { 
       currentWindowOnload(); 
      } 
      execJasmine(); 
     }, 0) 
+0

超时问题是异步调用不可靠。如果某个时候有更多的模块或者您处理的延迟时间比平常高,这将会失败。 – 2012-07-18 11:34:53

1

看一看异步调用茉莉文档里面,最有可能夺得需要等待属性为现在你可以运行你的规格。

https://github.com/pivotal/jasmine/wiki/Asynchronous-specs

根据更新后的问题,并通过您所提供的jQuery插件文档阅读,这个问题是清楚的:

/** 
* Your App code 
*/ 
var myTestObj = {}; 
define([ 
    // some stuff 
], function() { 
    // will be called when everything is ready 
    myTestObj.loaded = true; 
}); 


/** 
* Jasmine spec 
*/ 

describe("My suite", function() { 

    it("should run some test", function() { 
     // waitsFor is called periodically and will only execute 
     // the following run statement when it returns true 
     // waiting will be aborted after 10 seconds in this example 
     waitsFor(function() { 
      return myTestObj.loaded; 
     }, "Async modules to be loaded", 10000); 

     runs(function() { 
      expect(myTestObj.loaded).toBeTruthy(); 
     }); 
    }); 

}); 

这是一个非常简单的例子,但你应该得到的原则。 WaitsFor定期检查条件,并且可以在等待完成后使用运行语句执行。您可以使用运行语句来包装describe,it或expect调用。

+0

感谢您的回复,但实际上目前尚不清楚该如何解决该问题。我确实更新了我的答案,请阅读。谢谢。 – 2012-07-18 07:48:11