如何使用jasmine测试框架模拟类的私有函数

时间:2018-01-30 20:23:24

标签: javascript jasmine jasmine2.0

我正在尝试模拟我班级的私人功能。我已经使用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();
    });
});

1 个答案:

答案 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;关于这个问题的一些非常好的阅读。

...

所有这一切,如果不能测试该功能,那么对于重构来说可能是个好例子。