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
});
答案 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()
作为依赖项。