我创建了一个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
});
});
但这不起作用。 有什么想法吗?
答案 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.random
,console.log
,console.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'))
})