使用磁带进行 redux-saga 测试
redux-saga testing with tape
我正在尝试对 redux-saga 进行测试。当我出于某种未知原因执行 generator.next(data).value 时,数据不会按如下方式传递到 saga 函数:
const gen = onCreateMessage()
const message = "aa"
gen.next(message).value
///SAGA 函数
export function* onCreateMessage(message) {
yield put(addMessage(message.payload))
错误信息。无法读取未定义的负载。
问题是您的生成器函数接受 message
作为参数,因此您需要在初始化生成器时传递它:
const gen = onCreateMessage( /* the message */ )
然后您可以通过执行 gen.next().value
并验证您的断言来获得下一个值。
这是一个带有示例的 JS Bin:http://jsbin.com/catisu/edit?js,console
const { put, take } = ReduxSaga.effects;
const { expect } = chai;
const createMessage = message => ({
type: 'CREATE_MESSAGE',
payload: message,
});
const addMessage = message => ({
type: 'ADD_MESSAGE',
payload: message,
});
function* onCreateMessage(message) {
yield put(addMessage(message.payload));
}
// In your test
const message = 'some message';
// Message is passed when the generator is initialized
const gen = onCreateMessage(createMessage(message))
let next = gen.next();
// Using Chai here but with tape it'd be the same concept
try {
expect(next.value).to.eql(
put(addMessage(message))
);
console.log('It works!');
} catch(e) {
console.error('bummer');
}
<script src="https://npmcdn.com/redux-saga@0.11.1/dist/redux-saga.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.min.js"></script>
也是一件小事,但看起来您的生成器需要一个带有 payload
键的对象,因此纯字符串不起作用。
我正在尝试对 redux-saga 进行测试。当我出于某种未知原因执行 generator.next(data).value 时,数据不会按如下方式传递到 saga 函数:
const gen = onCreateMessage()
const message = "aa"
gen.next(message).value
///SAGA 函数
export function* onCreateMessage(message) {
yield put(addMessage(message.payload))
错误信息。无法读取未定义的负载。
问题是您的生成器函数接受 message
作为参数,因此您需要在初始化生成器时传递它:
const gen = onCreateMessage( /* the message */ )
然后您可以通过执行 gen.next().value
并验证您的断言来获得下一个值。
这是一个带有示例的 JS Bin:http://jsbin.com/catisu/edit?js,console
const { put, take } = ReduxSaga.effects;
const { expect } = chai;
const createMessage = message => ({
type: 'CREATE_MESSAGE',
payload: message,
});
const addMessage = message => ({
type: 'ADD_MESSAGE',
payload: message,
});
function* onCreateMessage(message) {
yield put(addMessage(message.payload));
}
// In your test
const message = 'some message';
// Message is passed when the generator is initialized
const gen = onCreateMessage(createMessage(message))
let next = gen.next();
// Using Chai here but with tape it'd be the same concept
try {
expect(next.value).to.eql(
put(addMessage(message))
);
console.log('It works!');
} catch(e) {
console.error('bummer');
}
<script src="https://npmcdn.com/redux-saga@0.11.1/dist/redux-saga.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.min.js"></script>
也是一件小事,但看起来您的生成器需要一个带有 payload
键的对象,因此纯字符串不起作用。