0
我有一個簡單的減速與速凍的終極版測試突變對象
const uid =() => Math.random().toString(34).slice(2);
const bots = (state = [] , action) => {
switch(action.type) {
case 'ADD_BOT':
return [
...state, {
id: uid(),
isDone: false,
text: action.bots.text
}
]
//this will fail
case 'ADD_BOT_THAT_MUTATES':
console.log("mutating");
action.bots.id = uid();
state.push(action.bots);
return state;
default:
return state;
}
}
export default bots
而且我的規格文件
import deepFreeze from 'deep-freeze';
import bots from '../bots';
describe('Simple test',() => {
function addBot(text) {
return {
type: 'ADD_BOT',
bots: {
id: 1,
isDone: false,
text: text
}
};
}
function addBotThatMutates(text) {
return {
type: 'ADD_BOT_THAT_MUTATES',
bots: {
id: 1,
isDone: false,
text: text
}
};
}
let state = [];
deepFreeze(state);
beforeEach(() => {
state = bots(state, addBot("initial"));
});
it('should fail due to deepFreeze',() => {
//create a payload
let payload = addBot("test 1234");
let payloadThatMutates = addBotThatMutates("test 5678");
state = bots(state, payload);
state = bots(state, payloadThatMutates);
expect(3).toEqual(state.length);
});
});
當我打電話減速機採用state = bots(state, payload);
我希望它返回一個非突變陣因爲我在Reducer中使用了ES6擴展語句。
當我打電話給state = bots(state, payloadThatMutates);
時,我期待着deepFreeze標記的錯誤。這是因爲在Reducers中我使用的是state.push(action.bots);
,我知道它會發生變異。
但我沒有得到任何錯誤,我的結果狀態是一個由3個對象組成的數組。
我有一個不正確的減速器,或者我沒有理解deepFreeze?
這個單元測試沒有按我期望的那樣工作。但是,如果我調用'ADD_BOT_THAT_MUTATES操作並且Reducer沒有更新狀態,即我的App/Web代碼有效,即Redux會改變狀態。
或者我只是做了一些簡單的愚蠢?