Автор оригинала: Dave Schinkel.
Я только что понял сегодня, что из-за типа испытаний у меня было в моем спецификации, и тот факт, что наше Творцы действий
передаются нашему Контейнер
через mapdispatchtopops
что мне даже не нужно было Nock
Вызывает изолировать мои тесты. Это не всегда так, иногда имеет смысл Nock
Но в этом случае мне не нужно.
Ниже есть Интеграция Тест на существующие Наследие код. Я называю это Изолированные тест интеграции Поскольку эти тесты не делают звонков на реальные вещи (реальные вызовы API по сети, попадают на реальную БД и т. Д.). Это также тест интеграции, потому что это Испытает несколько компонентов как единицы Отказ Я использую фермент Гора ()
Для интеграционных тестов.
Пример – Mock Collaborator (Eactor Creator) с манекеном
Здесь обратите внимание, что fetchsearch ()
передается к подключенному контейнеру через mapdispatchtopops
Отказ Ну, это значит Я могу ввести свой собственный манекен как опоры от моего теста :
некоторые.spec.js.
import { createStore, expect, mount, nock, Provider, React } from 'test/test.helpers'; import { Search } from 'app/components/containers/Search'; describe('Search', () => { describe('Successful', () => { let search; beforeEach(() => { const reducers = require('config/reducers').default; // note: stub could/should be refactored to reduce repetition const panels = { member: [{ headline: 'New', customViews: [ { name: 'Hockey', url: 'https://fakehost/items', }, { name: 'Football', url: 'https://fakehost/items', }], }, { headline: 'Old', customViews: [ { name: 'Hockey', url: 'https://fakehost/items', }, { name: 'Football', url: 'https://fakehost/items', }], }], }; search = mount(); }); ... it('contains category tabs with items', () => { const items = search.find('.ft-search-tab'); expect(items.length).to.equal(2); }); }); // I don't need to nock (this time)!! - Remove this helper! const mockGet = (url, uri, responseCode, responseBody) => { nock(url) .matchHeader('accept', 'application/json, text/plain, */*') .get(uri) .reply(responseCode, responseBody); }; }); {}} //send in a dummy panels={panels} ...whatever else />
Так что я имею в виду это: fetchsearch = {() => {}}
Отказ Поэтому мой контейнер в конечном итоге вызывает это, а не создатель действий.
React-redux подключен контейнер
export default class Search extends Component { ... componentDidMount() { ... this.props.fetchSearch(); // calls my dummy (ah! I forgot about this!) ... } render() { ... ); } } export default connect(null, { fetchSearch, ... })(Search)
Имейте в виду, что я также мог отправить в данные оструи, просто вернув его из манекена:
fetchsearch = {() => {панели}}
В зависимости от того, как с ним работает ваш реактивный компонент, это может не иметь смысла или работать. Если это сделает, то отлично, одна линия кода в вашем тесте.
Иногда вы получаете туннельное зрение и привыкли использовать что-то вроде Nock
Это, так что это просто хорошее время от времени, чтобы проверить, что ваши тесты действительно делают, наступая через или изменяющий код продукта для проверки того, что тесты действительно хорошие .. Или делают вещи в том, что вы думаете, что они.
Окончательное примечание : Помните, Вам не нужна издевалка Для почти много почти все. Я на самом деле не использую один, кроме редких случаев, где Синон
и Nock
может быть полезно. Удобства, мне не нравится приглашать много магии в мой код и обычные, я могу уйти с моими собственными издевателями Cusotm, которые в конечном итоге становятся суперпростыми и простыми в большом количестве случаев.
Я использую моча
здесь с фермент
, потому что это работает просто хорошо, шума – это афера).