2017-01-26 11 views
0

Я использую fetch-mock, чтобы высмеять некоторые запросы на сервер. Здесь производятся все запросы:fetch-mock все издевательства все запросы

import fetchMock from 'fetch-mock' 
import initialState from 'src/initial-state' 

if (process.env.NODE_ENV === 'development') { 
    fetchMock.post('/some/endpoint', initialState.entities.multichannelEngagement) 
} 

Но не только эта конечная точка является насмешка, но все запросы, сделанные с изоморфными-выборки

import 'isomorphic-fetch' 
export function makeRequest(endpoint, config = {}) { 
    return window.fetch(endpoint, config) 
    .then(response => { 
    return response.json() 
    .then(json => ({ json, response })) 
    .catch(() => ({ response })) 
}) 
.then(({ json, response }) => { 
    if (!response.ok) { 
    throw json ? json : new Error(response.statusText) 
    } else { 
    return json 
    } 
}) 
.catch((e) => { 
    return Promise.reject(e) 
}) 

}

Мой webpack.config .js выглядит следующим образом:

import path from 'path' 
import dotenv from 'dotenv' 
import webpack from 'webpack' 
import info from './package.json' 

const resolvePath = p => path.join(__dirname, p) 

const __DEV__ = process.env.NODE_ENV !== 'production' 

const { parsed: env } = dotenv.load() 
env.NODE_ENV = process.env.NODE_ENV 
Object.keys(env).forEach(k => env[k] = JSON.stringify(env[k])) 

const config = { 
    name: info.name, 

    entry: { 
    app: 'src/index', 
    vendor: Object.keys(info.dependencies) 
    }, 

    output: { 
    path: __DEV__ ? resolvePath('public') : resolvePath('../analytics-server/server/public'), 
    filename: '/js/[name].js', 
    publicPath: '/', 
    debug: __DEV__, 
    pathinfo: __DEV__ 
    }, 

    module: { 
    preLoaders: [{ 
     // NOTE: Run linter before transpiling 
     test: /\.js$/, 
     loader: 'eslint-loader', 
     exclude: /node_modules/ 
    }], 
    loaders: [{ 
     test: /\.js$/, 
     loader: 'babel', 
     exclude: /node_modules/ 
    }, { 
     // TODO: Remove after upgrading to webpack 2 
     test: /\.json$/, 
     loader: 'json' 
    }] 
    }, 

    resolve: { 
    alias: { 
     src: resolvePath('src'), 
     core: resolvePath('src/core'), 
     components: resolvePath('src/components'), 
     modules: resolvePath('src/modules'), 
     services: resolvePath('src/services'), 
     resources: resolvePath('src/resources'), 
     locales: resolvePath('src/locales') 
    }, 
    // NOTE: Empty string to properly resolve when providing extension 
    // TODO: Remove after upgrading to webpack 2 
    extensions: ['', '.js'] 
    }, 

    plugins: [ 
    // NOTE: `NoErrorsPlugin` causes eslint warnings to stop the build process 
    // new webpack.NoErrorsPlugin(), 
    new webpack.optimize.CommonsChunkPlugin('commons', '/js/commons.js'), 
    new webpack.DefinePlugin({ process: { env } }) 
// new webpack.NormalModuleReplacementPlugin(/^fetch-mock$/, path.resolve(__dirname, 'node_modules', 'fetch-mock/src/client.js')) 
    ], 

    eslint: { 
    configFile: resolvePath('.eslintrc') 
    } 
} 

if (__DEV__) { 
    config.devtool = 'source-map' 

    config.devServer = { 
    contentBase: 'public', 
    // NOTE: Options `inline` and `hot` shall be passed as CLI arguments 
    // inline: true, 
    // hot: true, 
    historyApiFallback: true 
    } 
} else { 
    config.plugins.push(...[ 
    new webpack.optimize.DedupePlugin(), 
    new webpack.optimize.OccurenceOrderPlugin(), 
    new webpack.optimize.UglifyJsPlugin({ 
     compress: true, 
     acorn: true 
    }) 
    ]) 
} 

export default config 

Я получаю ошибку, когда я запустить приложение "fetch-mock.js: 93 Ошибка при сбое: для ответа GET на http://localhost:3000/api/session нет ответа на возврат, который является первым запросом, сделанным в приложении.

Не знаю, почему fetch-mock издевается над всеми запросами. При оценке на хром-консоли значение fetch функции makeRequest является функцией fetch-mock, но насколько я знаю, это правильно.

BTW, я не тестирую env, я нахожусь на разработке, потому что мне нужно, чтобы мой бэкэнд насмехался, потому что он еще не закончен.

Любая идея, почему это происходит?

Заранее спасибо

ответ

2

Проблема вызвана тем, что главная цель fetch-mock «s, чтобы помочь с тестированием. В тестовой среде лучше, если вы получите исключение для любых отправленных не издевающихся вызовов.

Вы можете, однако, добавить обработчик catch, который делегирует оригиналу fetch, поэтому любой необработанный запрос передается в реальную выборку. Что-то вроде следующего:

/* FAKE FETCH ME */ 
    fetchMock.get('/session', function getSession(url, opts) { 
    const jwt = extractToken(opts) 
    if (!jwt || jwt !== fakeToken) { 
     return delay({ 
     status: 401, 
     body: JSON.stringify({ 
      details: 'Unauthorized' 
     }) 
     }) 
    } 
    return delay({ 
     status: 200, 
     body: JSON.stringify({ 
     success: true, 
     data: fakeUserDetails 
     }) 
    }) 
    }) 
    .catch(unmatchedUrl => { 
    // fallover call original fetch, because fetch-mock treats 
    // any unmatched call as an error - its target is testing 
    return realFetch(unmatchedUrl) 
    }) 

У библиотеки была опция для этого, но она была удалена в V5. Смотрите документацию здесь:

In previous versions fetch-mock had a greed property, set to

  • good - unmatched calls respond with a 200
  • bad - unmatched calls error
  • none - allow unmatched calls to use native fetch and the network

This has now been replaced by a .catch() method which accepts the same types of response as a normal call to .mock(matcher, response). It can also take an arbitrary function to completely customise behaviour of unmatched calls. It is chainable and can be called before or after other calls to .mock(). The api to check for unmatched calls remains unchanged.

https://github.com/wheresrhys/fetch-mock/blob/master/V4_V5_UPGRADE_NOTES.md#handling-unmatched-calls-greed

+0

Спасибо чувак, это все – kanedaki