2015-10-15 154 views
0

我無法讓我的茉莉花測試文件從我的knockoutjs文件中獲取數據。我能夠創建knockout observables並在spec文件中測試它們,但不能測試其他文件。出於某種原因,當我嘗試訪問來自viewmodel.js文件的spec文件中的mainViewModel()時,未找到它。我有所有requirejs文件包括/定義,但由於某種原因,它仍然無法正常工作。茉莉花測試knockout.js與requirejs

這裏是我的代碼:

viewmodel.js:

define(["knockout", "jquery"], function (ko, $) { 

    var data = { 
     Name:"The Plan", 
     Id: 1 
    }; 

    var TestViewModel = function (data) { 
     var self = this; 

     self.planName = ko.observable(data.Name); 
     self.planId = ko.observable(data.Id); 

     return self; 
    } 

    function mainViewModel() { 
     var self = this; 

     self.plan = ko.observableArray([]); 
     self.plan.push(new TestViewModel(data)); 
    } 

    return mainViewModel; 

}); 

someSpec.js文件:

define(["knockout", "jquery"], function (ko, $) { 

describe("MyTestSpec", function() { 

    var viewmodel, data; 

    beforeEach(function() { 
     require(["knockout", "jquery", "testsViewModel"], function(ko, $, tvm){ 
      viewmodel = tvm.mainViewModel(); 
     }); 
    }); 

    it("should be able to connect to View Model file", function() {   
     expect(viewmodel.Id).toBe(1); 
    }); 
}); 
}); 

index.html文件:

<script type="text/javascript" src="Scripts/jasmine.js"></script> 
    <script type="text/javascript" src="Scripts/jasmine-html.js"></script> 
    <script type="text/javascript" src="Scripts/boot.js"></script> 

    <script type="text/javascript" src="Scripts/require.js"></script> 

    <script type="text/javascript"> 
    require.config({ 
     paths: { 
     "jquery": './Scripts/jquery-1.10.2.min', 
     "knockout": './Scripts/knockout.debug', 
     "testViewModel" :"./Scripts/viewmodel", 
     } 
    }); 
    // list spec files here 
    require(["knockout","jquery","specs/someSpec", "testViewModel"], function() { 
     window.onload(); 
    }); 
</script> 

回答

1

這裏有幾件你需要的東西修復:

  1. AMD require function with a callback是異步的。這意味着viewmodel只有在您的測試運行後才能設置。而不是使用require,只需在測試的define調用中包含testViewModel作爲依賴關係。或者,您可以使用同步API表單:tvm = require('testViewModel')

  2. viewmodel.js正在返回mainViewModel功能作爲模塊導出。所以這就是你在別處引用它時會得到的。所以,而不是viewmodel = tvm.mainViewModel(),你會使用viewmodel = tvm()

+0

偉大的建議,它的一些額外的修復工作。 'mainViewModel()'沒有返回任何東西,所以聲明的變量/函數是私有的,可以通過someSpec.js訪問。我剛剛添加'返回TestViewModel(數據)'以及您的建議,它工作正常。 –

+0

@FahadJameel我正在用knockout和requirejs進行測試。我發現嘲笑requirejs使用的依賴關係令人費解。你是如何解決這個問題的? – user2829759