我有以下方法使用coffeescript / jquery加载JSON文件:

Class JsonParser

this.return  = (json_file_path, string_to_query) ->
  $.getJSON json_file_path, (data) ->
    $.each data, (key,val) ->
     if key == string_to_query
       return val


我正在茉莉花中用以下方法进行测试:

expect(JsonParser.return("file.json", "key").toEqual("value")


但是,茉莉花吐出来的却是:

Expected { readyState : 1, getResponseHeader : Function, getAllResponseHeaders
 : Function, setRequestHeader : Function, overrideMimeType : Function, statusCode : Function, abort :
Function, state : Function, always : Function, then : Function, promise : Function, pipe : Function, d
one : Function, fail : Function, progress : Function, complete : Function, success : Function, error :
 Function } to equal 'value'.


假设JSON文件只有一行:{ "key": "value" }

我只是被jquery / coffeescript / ajax等弄湿了,不理解Jasmines的响应。让我知道是否需要更多信息,谢谢!

最佳答案

您的问题是您的return方法没有返回您认为的那样。您的return函数返回getJSON返回的内容,而getJSON是AJAX调用。 jQuery的AJAX调用全部返回jqXHRs,并且与AJAX回调返回的内容无关。事件的顺序如下所示:


您呼叫JsonParser.return
return调用$.getJSON
getJSON对服务器进行异步调用,然后返回jqXHR
return返回与jqXHR返回相同的getJSON
一段时间过去了。
服务器开始响应,然后调用回调以搜索JSON。


问题在于,尽管(5)发生了,但名为JsonParser.return的代码仍在运行,但没有JSON。

避开AJAX调用的异步特性的通常方法是发送一个回调函数,该函数将在准备就绪时被调用:

@return: (json_file_path, string_to_query, callback) ->
  $.getJSON json_file_path, (data) ->
    $.each data, (key,val) ->
     if key == string_to_query
       callback(val)


然后,您将像这样使用它:

JsonParser.return("file.json", "key", (value) ->
  # Do whatever needs to be done with value in here.
)


现在您有了一些应该起作用的东西,并且可以在这里找到如何将Jasmine与它结合使用:


  How do I verify jQuery AJAX events with Jasmine?

10-08 10:50
查看更多