2017-01-08 75 views
4

我想弄清楚Jest中的手動模擬。我認爲這應該很容易......但事實並非如此。在Jest中手動模擬對象

我的項目目錄被

  • __tests__
    • 用戶test.js
  • 車型
    • user.js的
    • __mocks__ 個
      • user.js的
  • node_modules
    • ...
  • 的package.json

這兩種型號/ user.js的和模型/ __ mocks__ /user.js具有相同的代碼:

module.exports = { 
    create(username, password) { 
     return new Promise(function(resolve, reject) { 
      setTimeout(function() { 
       resolve({"username":username, "password": password}); 
      }, 100); 
     }); 
    } 
} 

文件__tests __ /用戶test.js如下:

test('user creation works',() => { 
    const user = require('../models/user'); 
    //const user = jest.mock('../models/user'); 
    return user.create("mitchell", "boo"); 
}); 

這工作得很好,測試通過,但是當我將其更改爲:

test('user creation works',() => { 
    //const user = require('../models/user'); 
    const user = jest.mock('../models/user'); 
    return user.create("mitchell", "boo"); 
}); 

一點也沒有」 t工作,並吐出:

FAIL __tests__\user-test.js 
    ● user creation works 

    TypeError: user.create is not a function 

     at Object.<anonymous>.test (__tests__\user-test.js:4:17) 
     at process._tickCallback (internal\process\next_tick.js:103:7) 

回答

9

啊!弄清楚了!我的文件夾結構很好。原來,我對「jest.mock」實際做了什麼誤解。 「jest.mock」改變節點「require」函數的行爲來使用模擬,它本身並不需要。

我的測試應該看起來像:

jest.mock('../models/user'); 
test('user creation works',() => { 
    const user = require('../models/user'); 
    return user.create("mitchell", "boo"); 
});