Jasmine:在KnockoutJS中测试私有方法

时间:2016-05-25 16:10:59

标签: javascript knockout.js jasmine karma-jasmine

KnockoutJS中的ViewModels可以包含一些公共方法和一些私有方法。 公开方法:附加到自己的 public_method ,可用于绑定来自html的点击。

私有方法:在View模型中定义但未附加到视图模型的方法,只能由公共方法在内部使用。 通常使用函数privateMethod(){...}

定义
define(['./panel'], function (Panel) {

    'use strict';

    function myPrivateMethod() {...}

    self.myPublicMethod = function() {...}

});

在Jasmine中编写测试用例时,我们可以创建ViewModel的新实例并正常测试公共方法。但是我们如何测试私有方法呢。

define(['knockout'
], function (ko) {

    'use strict';

    describe('My Private Public Tests', function () {
        var testee;
        testee = new MyViewModel();

it('can test public methods easily', function(){
      // Can be Tested
      expect(testee.myPublicMethod()).toBe(true)
});

// How to Test myPrivateMethod
});

1 个答案:

答案 0 :(得分:0)

私有方法不可单元测试。即使你可以,我建议你不要(尝试)直接对它们进行单元测试。你将通过闭包的公共API对它们进行测试,如果你不是,那么代码就死了。

如果您仍然觉得应该测试这些私有方法,那么这可能是代码味道。 最有可能是你违反了SRP ,私有方法会有相当多的复杂逻辑。

尝试将这些私有方法分解为公共方法:静态公共方法,新类/闭包/函数上的方法等。然后,新单元将是可单元测试的。旧单位可以有例如新单元的私有实例。如果(创建)新单元足够复杂,您甚至可以使用工厂模式。

但是,您将新单元的实例提供给现有单元,现在可以在单元测试中伪造或模拟它。

以下是您的上下文中的一些伪代码,其中现有单元只是要求合作者公开公开myPrivateMethod的功能:

function Collaborator() {
    function myPrivateMethod() {/*...*/}
    this.reasonForExistence = myPrivateMethod; // unit testable
}

function Panel(collaborator) {
    self.myPublicMethod = function() {
       // do stuff
       collaborator.reasonForExistence(); // relay to collaborator
       // do more stuff
    }
}

您可以在单元测试中提供假的collaborator,如果您想验证那个,请使用某种“间谍”检查myPublicMethod实际使用协作者

在实际场景中,您将传递new Collaborator()作为依赖项。