2014-12-02 57 views
3

當前單元測試設置一個匿名電話模塊:懲戒在茉莉花使用requireJs

  • 茉莉花2.1
  • RequireJs 2.1.15
  • 放肆3.2.6

在我們的代碼庫,我們有許多模塊通過requireJs加載來抽象出功能。例如將通話抽象到服務器的通信。然而,這些模塊返回一個匿名函數:

define(['jquery'], function ($) { 

    return function (method, link, payload) { 
     // code removed as not required for question 
     return $.ajax({ 
      type: method, 
      url: link, 
      data: payload 
     }); 
    }; 
}) 

這是再通過requireJs進口/ AMD其他模塊加載和使用方式如下:

var promise = communicator("GET", "/url/to/my/webapi", {}); 

我現在有這被導入一個模擬模塊爲單位測試繞過$ .ajax調用,並返回一個承諾,但是我真的想在我的單元測試中測試它已被調用或沒有和正確的值已被傳入等我試圖看着間諜,但作爲它不會公開模塊上的命名函數我無法使用此方法。

如何設置預期/嘲諷匿名AMD返回功能?

EDIT

使用示例清晰,以幫助:

define(['communicator'], function (communicator) { 

     var vm = function (id) { 
      var self = this; 

      self.Id = id 

      self.submitForm = function() { 
       var data = { }; 

       var promise = communicator("PUT", "/url/to/web/api", data); 

       promise.done(function (message) { 
       }); 

       promise.fail(function (error) { 
       }); 
      }; 
     }; 

     return { 
      initialise: function (params) { 
       var viewModel = new vm(params.Id); 
       return viewModel; 
      } 
     }; 
    }); 

我希望能夠以測試submitForm函數(簡化了問題的目的),並希望嘲笑通信器依賴性,而不在測試項目require.js設置中定義一個存根模塊。

回答

2

我不知道你需要測試什麼,但你可以spyOn $.ajax並創建自己的諾言......

window.spyOn($, "ajax").and.callFake(function() { 
    var d = $.Deferred(); 
    d.resolve(true); 
    return d.promise(); 
}); 

expect($.ajax).toHaveBeenCalled(); 
// other expects... 
+0

我已經使用這種技術來測試通信模塊本身,但不想在測試依賴於通信器的「頂級」模塊時模擬通信模塊的基礎依賴關係。 – WestDiscGolf 2014-12-10 13:44:35

0

在我與改變模塊上有具體的方法去年底然後可以被窺視。我有其他的模塊,雖然它們的模式是相同的,但我會繼續追求。