2017-01-08 11 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"); 
}); 

Это Безразлично» т и выплевывает:

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"); 
});