我正在尝试模拟我班级的私人功能。我已经使用testEmployee .__ private.getStatus()测试我的私有方法。我面临的问题是私有函数getStatus的模拟。我想通过模拟getStatus函数测试具有不同状态代码的processSalary()。
这是我的代码。
var Employee = function() {
. . . . . // other private members
function getStatus() {
. . . . // other business logic
return call_external_service_for_status(employeeData);
};
. . . . //other private functions
//public methods
this.processSalary = function(){
var employeeStatus = getStatus()
if(employeeStatus === 1){
. . .
}
else if(employeeStatus === 2)
{
. . . . .
}
. . . . . . // other conditional statements
};
this.__private = {
getStatus: getStatus
. . . . //other private functions
}
};
describe("Employee salary", function() {
it("process Employee salary with status 1", function() {
var testEmployee = new Employee();
// want to mock private function to return status as 1
testEmployee.processSalary();
expect(testPerson.getStatus).toHaveBeenCalled();
});
});
答案 0 :(得分:0)
...
//public methods
this.processSalary = function(){
var employeeStatus = getStatus() // <<<<<<<< should this be
// this.__private.getStatus() ?
if(employeeStatus === 1){
. . .
}
else if(employeeStatus === 2)
{
. . . . .
}
. . . . . . // other conditional statements
};
...
describe("Employee salary", function() {
it("process Employee salary with status 1", function() {
var testEmployee = new Employee();
// want to mock private function to return status as 1
// <<<<<<<<< then here you can redefine the "private"
// member of the class
testEmployee.__private.getStatus = function() {
console.log("I'm doing new things");
}
testEmployee.processSalary();
expect(testPerson.getStatus).toHaveBeenCalled();
});
});
声明为您在&#34;其他私有函数中声明它们的函数&#34;如果在不参考公共方法中的父类的情况下使用它们,则不会更改该节。
您可以在公共方法中引用此.__ private.getStatus,但为了方便在测试期间重新定义属性,您可以交换隐私。
这指出的问题是如何设计一个能够达到预期效果的类系统! https://philipwalton.com/articles/implementing-private-and-protected-members-in-javascript/&lt;关于这个问题的一些非常好的阅读。
...
所有这一切,如果不能测试该功能,那么对于重构来说可能是个好例子。