2015-09-07 43 views
5

我想測試一個JS使用一個第三個庫獲取數據,所以我使用笑話模擬實現。當我在測試中直接調用它時,它正在工作。但是,它在源代碼中使用時不起作用。笑話模擬實現不符合要求('')

下面是代碼

//Source implementation 

var reference = require('./reference'); 

module.exports = { 
    getResult: function() { 
    return reference.result(); 
    } 
}; 


//Test code 

jest.dontMock('./foo'); 
jest.dontMock('console'); 

describe('descirbe', function() { 
    var foo = require('./foo'); 

    it('should ', function() { 
    var reference = require('./reference'); 

    reference.result.mockImplementation(function (a, b, c) { 
     return '123' 
    }); 

    console.log(foo.getResult()); // undefined 
    console.log(reference.result()); // 123 
    }); 

}); 

回答

2

你需要的順序是錯誤的。當您在設置模擬reference之前需要./foo時,則fooreference將根據最佳自動鎖定而未定義。

jest.dontMock('./foo');                                                     

describe('descirbe', function() {                                                   
    it('should ', function() {                                                    
     var reference = require('./reference');                                                
     reference.result.mockImplementation(function (a, b, c) { 
      return '123'; 
     });                                                
     var foo = require('./foo');                                                   

     console.log('ferr', foo.getResult()); // ferr 123                                                 
    });                                                          
}); 
2

var foo = require('./foo');

describe獲取評估並存儲在foo

之後,在it區塊中,您正在嘲笑這一點,但這不適用於舊參考foo

mockImplementation調用後將foo修復錯誤。

//Test code 

jest.dontMock('./foo'); 
jest.dontMock('console'); 


describe('describe', function() { 

    it('should ', function() { 
    var reference = require('./reference'); 

    reference.result.mockImplementation(function (a, b, c) { 
     return '123' 
    }); 
    var foo = require('./foo'); 

    console.log(foo.getResult()); // undefined 
    console.log(reference.result()); // 123 
    }); 

});