javascript - Jasmine 使用 requirejs 测试 knockout.js

标签 javascript unit-testing knockout.js requirejs jasmine

我在获取 Jasmine 测试文件以从 Knockoutjs 文件中获取数据时遇到问题。我能够创建 knockout 可观察值并测试规范文件中的可观察值,但不能测试其他文件。由于某种原因,当我尝试从 viewmodel.js 文件访问规范文件中的 mainViewModel() 时,找不到它。我已包含/定义了所有 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. AMD require function with a callback是异步的。这意味着 viewmodel 在测试运行之后才会被设置。无需使用 require,只需将 testViewModel 作为依赖项包含在测试的 define 调用中即可。或者,您可以使用同步 API 形式:tvm = require('testViewModel')

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

关于javascript - Jasmine 使用 requirejs 测试 knockout.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33158112/

相关文章:

javascript - D3 物理重力

javascript - 抛出 mocha 异常可以使测试在不应该通过的情况下通过

knockout.js - 创建后可以更改 knockout throttle 延长器吗?

javascript - 如何测试: onClick event - Jest/Enzyeme

mvvm - 编程更改不会反射(reflect)在 knockout View 模型中

javascript - 在某些情况下, knockout 模板仍处于加载状态

javascript - 现有选项卡的样式看起来像单选按钮

javascript - 如何针对不同的功能多次调用requestAnimationFrame?

javascript - Nativescript 从原生图像中获取 base64 数据

java - 如何对遗留 J2EE 应用程序进行单元测试