2014-12-05 8 views
4

У меня есть Реальный вид, который взаимодействует с магазином . Я успешно тестировал просмотры и хранилища отдельно, но не в комбинации.Как использовать Jest для проверки вида React для проводки?

Я следил за structure documented here, но получил ТипError. Похоже, что Jest пытается зарегистрировать магазин как компонент, даже если я использую dontMock.

Using Jest CLI v0.2.0 
PASS __tests__/unit/spec/stores/ViewStore-spec.js (0.248s) 
FAIL __tests__/unit/spec/components/View-spec.react.js (0.942s) 
undefined 
● View › it defaults to zero unread 
    - TypeError: /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/components/View.react.js: /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/stores/ViewStore.js: Cannot call method 'register' of undefined 
     at /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/stores/ViewStore.js:43:31 
     at Object.runContentWithLocalBindings (/Users/matnorri/dev/projects/matnorri/web-client/node_modules/jest-cli/src/lib/utils.js:357:17) 
     ... 

Я включил то, что, по моему мнению, является соответствующим кодом ниже, но при необходимости может предоставить его в полном объеме.

Просмотр Jest Тест

jest.dontMock('../../../../src/app/scripts/components/View.react'); 
jest.dontMock('../../../../src/app/scripts/stores/ViewStore'); 

describe('View', function() { 

    var React; 
    var TestUtils; 
    var ViewComponent; 
    var View; 

    beforeEach(function() { 
    React = require('react/addons'); 
    TestUtils = React.addons.TestUtils; 
    ViewComponent = 
     // Tried both lines with same effect. 
     // require('../../../../src/app/scripts/components/View.react.js'); 
     require('../../../../src/app/scripts/components/View.react'); 
    View = TestUtils.renderIntoDocument(<ViewComponent />); 
    }); 

    it('defaults to zero unread', function() { 
    View._toString = jest.genMockFunction(); 
    View._onChange(); 
    expect(View.state.unread).toBe(0); 
    }); 
}); 

Спасибо!

ответ

4

Ответ на ваш вопрос

я столкнулся с этой проблемой тоже, и не издеваясь объект-Присвоить решить проблему для меня. Добавьте jest.dontMock('object-assign'); в свой файл спецификации. Это решит проблему.

// View Jest test 
jest.dontMock('../../../../src/app/scripts/components/View.react'); 
jest.dontMock('../../../../src/app/scripts/stores/ViewStore'); 

Чтобы дразнить или не дразнить

Некоторые больше информации о том, когда «фиктивный или не издеваться» можно найти на Jest documentation website.

Jest изменяет поведение по умолчанию метода require и реализует его собственный метод require. Таким образом, они могут издеваться над каждой функцией внутри файла. Поэтому, если вы хотите, чтобы что-то действительно работало (например, в магазине), вы не должны издеваться над файлом.

В вашем случае вы не издеваетесь над ViewStore, поэтому каждая функция этого магазина будет вызвана. Поскольку вы не высмеивали object-assign, функция назначения объекта не работает. Таким образом, ViewStore не создается правильным способом (он возвращает undefined), и тест выдает ошибку Cannot call method 'register' of undefined, так как ваша функция assign не работает, потому что это было издевательство.

Снова; Если вы прочитаете документацию на веб-сайте Jest, вы найдете подробное описание того, когда «фальсифицировать или не издеваться».


Экстра Информация

Я рекомендую добавить "объект-Assign" и другие часто используемые модули (например, lodash/подчеркиванием) к unmockedModulePathPatterns в тестовой конфигурации. Дополнительная информация: https://facebook.github.io/jest/docs/api.html#config-unmockedmodulepathpatterns-array-string

+0

Благодарим за ответы, объяснения и дополнительные ссылки. Я ценю это. Этот меня сводил с ума! –

+0

Я знаю это чувство, тоже занял некоторое время, прежде чем узнал. Рад, что смог помочь. – Stefan

+0

@stefan, у меня такая же проблема, но добавление объекта, назначаемого моему незафиксированному пути, похоже, ничего не делает. Предложения? '' '" unmockedModulePathPatterns ": [ "./ node_modules " "объект-правопреемником" ]' '' – 4m1r