Redux-saga选择条件语句测试

时间:2017-06-20 10:36:07

标签: reactjs redux redux-saga

我创建了一个saga,它使用select从商店中检索一个值,并根据此值运行一个或另一个语句:

const {id} = action.payload;
try {
  const cache = yield select(state => state.cache);
  if (cache[id]) {
    // Do something
  } else {
    // Do something else
} catch (e) {
  // errors
}

我试图用react-mock-store模拟商店:

import configureStore from 'redux-mock-store';
import createSagaMiddleware from 'redux-saga';
import { expect } from 'chai';
import { getCacheSaga } from '../../../src/js/sagas/cache-saga';
import { GET_CACHE } from '../../../src/js/actions/cache-actions';

const middlewares = [createSagaMiddleware()];
const mockStore = configureStore(middlewares);
mockStore({ cache: { foo: {} } });

describe('get cache saga', () => {
  describe('getCacheSaga', () => {
    it('retrieves data from cache', () => {
    const iterator = getFormSaga({
      payload: { id: 'foo' },
    });
    const cache = iterator.next();
    console.log(cache); // undefined
  });
});

但这不起作用。 有什么想法吗?

1 个答案:

答案 0 :(得分:5)

Sagas只有声明效果,而不会实际执行效果。这基本上就是为什么它可以在没有模拟的情况下进行测试。

所以你不需要模仿任何东西。测试效果说明。

公开你的选择器

// cache-selector

export default state => state.cache

内部测试

import getCache from './cache-selector'

describe('get cache saga', () => {
  describe('getCacheSaga', () => {
    it('retrieves data from cache', () => {
    const iterator = getFormSaga({
      payload: { id: 'foo' },
    });
    expect(iterator.next().value).to.be.deep.equal(select(getCache))

    // fake effect
    const fakeCache = { foo: 'bar'}
    const nextEffect = iterator.next(fakeCache)

    // next assertion

    expect(nextEffect.value).to.be.deep.equal(...)


  });
})

长读

考虑以下示例

假设您需要测试执行以下操作的函数

function roll() {
  if(Math.random() > 0.5) {
    console.log('OK')
  } else {
    console.error('FAIL')
  }
}

如何测试?简单的回答就是嘲笑。在这里,您需要模仿Math.randomconsole.logconsole.error

有了saga,你可以做到没有嘲弄。首先使用声明效果重写

function* rollSaga() {
  const random = yield call(Math.random)

  if(random > 0.5) {
     yield call(console.log, 'OK')
  } else {
     yield call(console.log, 'FAIL'
  }
}

然后测试

it('should call Math.random', () => {
   const iter = rollSaga()

   expect(iter.next().value).to.be.deep.equal(call(Math.random))
})

it('should log OK if random is > 0.5', () => {
   const iter = rollSaga()

   iter.next() // call random

   expect(iter.next(0.6).value).to.be.deep.equal(call(console.log, 'OK'))
})

it('should show error if random is < 0.5', () => {
   const iter = rollSaga()

   iter.next() // call random

   expect(iter.next(0.4).value).to.be.deep.equal(call(console.error, 'FAIL'))
})