2015-02-18 3 views
3

Я тестирую приложение React/Reflux, используя Jest. У меня есть следующие функции в магазине:Как издеваться над определенной функцией в объекте с помощью Jest?

onLoad: function() { 
    console.log("ORIGINAL LOAD"); 
    // http request here 
} 

Я пытаюсь дразнить его так, что он просто делает то, что ему нужно делать, не делая фактический материал сети:

beforeEach(function() { 

    // mock out onLoad so instead of making API call the store gets test data 
    PostStore.onLoad = jest.genMockFunction().mockImplementation(function() { 
    var p1 = new Post(
     "54da7df5119025513400000a",     // id 
     "Test Post",         // title 
     "Kji6ftLjUqhElgnqOBqMUKxYONpU7nK/cu6jTA==\n", // owner anonId 
     "Test Course 1",        // course name 
     "This is a test!",        // content 
     6,            // upvotes 
     2,            // downvotes 
     ["Kji6ftLjUqhElgnqOBqMUKxYONpU7nK/cu6jTA==\n"] // voter anonIds 
    ); 

    this.posts = [p1]; 
    console.log("mocked function"); 
    }); 

    // component initialized here 
}); 

Однако, кажется, что издевательская функция никогда не создается. Когда я запускаю тесты, консоль все еще регистрирует ORIGINAL LOAD.

Каков правильный способ переопределить метод объекта, чтобы вместо того, чтобы устанавливать массив posts в PostStore, выполнив вызов ajax, он просто устанавливает его с помощью тестовых данных?

+0

ли вы когда-нибудь решить это? У меня очень похожая проблема, но я тестирую Jasmine и вводя зависимости с помощью Rewire. Я зарегистрировал проблему в репо Reflux GitHub: https://github.com/spoike/refluxjs/issues/300 –

+0

Я никогда не разрешал это, но для Жасмин я рекомендую использовать Sinon для издевательства. – Hugo

+0

спасибо, это оказалось ограничением Rewire, впрыскивая зависимость после загрузки mixin Store Reflux. Я закончил работу с [инъектором-загрузчиком] (https://github.com/plasticine/inject-loader) для webpack –

ответ

0

Я нашел функцию шутки фиктивного экземпляра It's here

например:

import expect from 'expect'; 

jest.mock('../libs/utils/Master'); 
import Master from '../libs/utils/Master'; 

Master.mockImplementation(() => { 
    return { 
    returnOne: jest.fn().mockReturnValueOnce(1) 
    } 
}) 
describe('test Master', function() { 
    it('test search', function() { 
    let master = new Master(); 
    expect(master.returnOne()).toEqual(1); 
    }); 
}); 
2

Почти там, все, что вам нужно сделать, это

const onLoad = jest.fn().mockImplementation(function() { 
    var p1 = new Post();//Add your stuff here 
    this.posts = [p1]; 
    console.log("mocked function"); 
    }); 
PostStore.onLoad = onLoad.bind(PostStore); //PostStore is your object.