Jasmine 测试 knockout.js 与 requirejs

Jasmine Testing knockout.js with requirejs

我无法让我的 Jasmine 测试文件从我的 knockoutjs 文件中获取数据。我能够创建淘汰可观察对象并测试规范文件中的那些,但不能测试其他文件。出于某种原因,当我尝试从 viewmodel.js 文件访问规范文件中的 mainViewModel() 时,找不到它。我有所有的 requirejs 文件 included/defined 但由于某种原因它仍然无法正常工作。

这是我的代码:

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. AMD require function with a callback是异步的。这意味着 viewmodel 在您的测试 运行 之前不会被设置。不要使用 require,只需将 testViewModel 作为依赖项包含在测试的 define 调用中。或者,您可以使用同步 API 形式:tvm = require('testViewModel').

  2. viewmodel.js 返回 mainViewModel 函数 作为模块导出。这就是您在其他地方引用它时会得到的。因此,您可以使用 viewmodel = tvm().

  3. 而不是 viewmodel = tvm.mainViewModel()