2017-08-26 7 views
1

私は学校でReduxを勉強しています。そのようなテストでは、ビルディングブロックの理解に役立つベンチマークがあることを確認しています。Reduxの "Reducer"はデフォルトで初期状態を返し、デフォルト値を返すことができますか?

私はReducer関数を作成している部分までですが、ほとんど完了しました\o/しかし、私は1つのテストに合格することはできません。

1) returns the initial state by default

とコンソール下のバック吐く...

Reducer returns the initial state by default:

AssertionError: expected undefined to be an object at Context. (tests/redux.spec.js:103:49)

は私のテストはすべて、1は、例えば、輸入のために責任を負うことになるの懸念のいくつかを扱うなど、アクションの種類を作成するしかしないからだと考えて。だから多分私はテストが提供していない何かを逃している?とにかくここ

は私の減速ファイルです:

import pet from "../components/PetPreview"; 
import { createStore } from "redux"; 

import { adoptPet, previewPet, addNewDog, addNewCat } from "./action-creators"; 
// ACTION TYPES 
const PREVIEW_PET = "PREVIEW_PET"; 
const ADOPT_PET = "ADOPT_PET"; 
const ADD_NEW_DOG = "ADD_NEW_DOG"; 
const ADD_NEW_CAT = "ADD_NEW_CAT"; 


// INTITIAL STATE 
const initialState = { 
    dogs: [ 
    { 
     name: "Taylor", 
     imgUrl: "src/img/taylor.png" 
    }, 
    { 
     name: "Reggie", 
     imgUrl: "src/img/reggie.png" 
    }, 
    { 
     name: "Pandora", 
     imgUrl: "src/img/pandora.png" 
    } 
    ], 
    cats: [ 
    { 
     name: "Earl", 
     imgUrl: "src/img/earl.png" 
    }, 
    { 
     name: "Winnie", 
     imgUrl: "src/img/winnie.png" 
    }, 
    { 
     name: "Fellini", 
     imgUrl: "src/img/fellini.png" 
    } 
    ] 
// These dogs and cats are on our intial state, 
// but there are a few more things we need! 
}; 


export default function reducer(prevState = initialState, action) { 
    var newState = Object.assign({}, prevState) 

    console.log('initialState', typeof initialState) 
    switch (action.type) { 

    case PREVIEW_PET: 
     // console.log('newState', newState) 
     return Object.assign({}, prevState, { 
     petToPreview: action.pet 
     }); 
     break 
    case ADOPT_PET: 
     return Object.assign({}, prevState, { 
     petToAdopt: action.pet 
     }); 
     break 
    case ADD_NEW_DOG: 
     // console.log('action', action.dog) 
     // console.log('prevState.dogs', prevState.dogs) 
     newState.dogs = prevState.dogs.concat([action.dog]) 
     return newState; 
     break 
    case ADD_NEW_CAT: 
     // console.log('action', action.dog) 
     // console.log('prevState.dogs', prevState.dogs) 
     newState.cats = prevState.cats.concat([action.cat]) 
     return newState; 
     break; 
    default: 
     return prevState; 

    } 
    return initialState 
} 

あなたは、私はそれはそれをすべきではないinitialState 戻っていswitchブロックの後に見ることができるように?事前に

import { expect } from "chai"; 
import { createStore } from "redux"; 

// You will write these functions 
import { 
    previewPet, 
    adoptPet, 
    addNewDog, 
    addNewCat 
} from "../src/store/action-creators"; 
import reducer from "../src/store/reducer"; 

const DOGS = [ 
    { 
    name: "Taylor", 
    imgUrl: "src/img/taylor.png" 
    }, 
    { 
    name: "Reggie", 
    imgUrl: "src/img/reggie.png" 
    }, 
    { 
    name: "Pandora", 
    imgUrl: "src/img/pandora.png" 
    } 
]; 

const CATS = [ 
    { 
    name: "Earl", 
    imgUrl: "src/img/earl.png" 
    }, 
    { 
    name: "Winnie", 
    imgUrl: "src/img/winnie.png" 
    }, 
    { 
    name: "Fellini", 
    imgUrl: "src/img/fellini.png" 
    } 
]; 

function getRandomPet(pets) { 
    return pets[Math.floor(Math.random() * pets.length)]; 
} 

describe("Action creators",() => { 
    describe("previewPet",() => { 
    it("returns properly formatted action",() => { 
     const pet = getRandomPet(DOGS); 

     expect(previewPet(pet)).to.be.deep.equal({ 
     type: "PREVIEW_PET", 
     pet: pet 
     }); 
    }); 
    }); 

    describe("adoptPet",() => { 
    it("returns properly formatted action",() => { 
     const pet = getRandomPet(DOGS); 

     expect(adoptPet(pet)).to.be.deep.equal({ 
     type: "ADOPT_PET", 
     pet: pet 
     }); 
    }); 
    }); 

    describe("addNewDog",() => { 
    it("returns properly formatted action",() => { 
     const pet = getRandomPet(DOGS); 

     expect(addNewDog(pet)).to.be.deep.equal({ 
     type: "ADD_NEW_DOG", 
     dog: pet 
     }); 
    }); 
    }); 

    describe("addNewCat",() => { 
    it("returns properly formatted action",() => { 
     const pet = getRandomPet(CATS); 

     expect(addNewCat(pet)).to.be.deep.equal({ 
     type: "ADD_NEW_CAT", 
     cat: pet 
     }); 
    }); 
    }); 
}); // end Action creators 

describe("Reducer",() => { 
    let store; 

    beforeEach("Create the store",() => { 
    // creates a store (for testing) using your (real) reducer 
    store = createStore(reducer); 
    }); 

    it("returns the initial state by default",() => { 
    // In addition to dogs and cats, we need two more fields 
    expect(store.getState().petToPreview).to.be.an("object"); 
    expect(store.getState().petToAdopt).to.be.an("object"); 
    }); 

    describe("reduces on PREVIEW_PET action",() => { 
    it("sets the action's pet as the petToPreview on state (without mutating the previous state)",() => { 
     const prevState = store.getState(); 

     const pet = getRandomPet(DOGS); 
     const action = { 
     type: "PREVIEW_PET", 
     pet: pet 
     }; 
     store.dispatch(action); 

     const newState = store.getState(); 

     // ensures the state is updated properly - deep equality compares the values of two objects' key-value pairs 
     expect(store.getState().petToPreview).to.be.deep.equal(pet); 
     // ensures we didn't mutate anything - regular equality compares the location of the object in memory 
     expect(newState.petToPreview).to.not.be.equal(prevState.petToPreview); 
    }); 
    }); 

    describe("reduces on ADOPT_PET action",() => { 
    it("sets the action's pet as the petToAdopt on state (without mutating the previous state)",() => { 
     const prevState = store.getState(); 

     const pet = getRandomPet(DOGS); 
     const action = { 
     type: "ADOPT_PET", 
     pet: pet 
     }; 
     store.dispatch(action); 

     const newState = store.getState(); 

     expect(newState.petToAdopt).to.be.deep.equal(pet); 
     expect(newState.petToAdopt).to.not.be.equal(prevState.petToAdopt); 
    }); 
    }); 

    describe("reduces on ADD_NEW_DOG action",() => { 
    it("adds the new dog to the dogs array (without mutating the previous state)",() => { 
     const prevState = store.getState(); 

     const pet = getRandomPet(DOGS); 
     const action = { 
     type: "ADD_NEW_DOG", 
     dog: pet 
     }; 
     store.dispatch(action); 

     const newState = store.getState(); 

     expect(newState.dogs.length).to.be.equal(prevState.dogs.length + 1); 
     expect(newState.dogs[newState.dogs.length - 1]).to.be.deep.equal(pet); 
     expect(newState.dogs).to.not.be.equal(prevState.dogs); 
    }); 
    }); 

    describe("reduces on ADD_NEW_CAT action",() => { 
    it("adds the new cat to the cats array (without mutating the previous state)",() => { 
     const prevState = store.getState(); 

     const pet = getRandomPet(CATS); 
     const action = { 
     type: "ADD_NEW_CAT", 
     cat: pet 
     }; 
     store.dispatch(action); 

     const newState = store.getState(); 

     expect(newState.cats.length).to.be.equal(prevState.cats.length + 1); 
     expect(newState.cats[newState.cats.length - 1]).to.be.deep.equal(pet); 
     expect(newState.cats).to.not.be.equal(prevState.cats); 
    }); 
    }); 

    describe("handles unrecognized actions",() => { 
    it("returns the previous state",() => { 
     const prevState = store.getState(); 

     const action = { 
     type: "NOT_A_THING" 
     }; 
     store.dispatch(action); 

     const newState = store.getState(); 

     // these should be the same object in memory AND have equivalent key-value pairs 
     expect(prevState).to.be.an("object"); 
     expect(newState).to.be.an("object"); 
     expect(newState).to.be.equal(prevState); 
     expect(newState).to.be.deep.equal(prevState); 
    }); 
    }); 
}); // end Reducer 

ありがとう:

以下はredux.spec.jsファイルです!

+0

ちょっと、正確な問題を理解できませんでした。初期状態で初期状態に戻したいのですか?もし何かが起こっているなら、あなたはさらに説明できますか? – mindaJalaj

+0

@mindaJalaj何が起こっているのは、最後のテストが通過していないようです。基本的に 'デフォルトで初期状態を返す'は渡されない。 –

+0

@jaihindhreddyが質問に美しく答えてくれたと思いますが、それは機能していますか? – mindaJalaj

答えて

1

は、テストケースのデフォルトの1は、inital自身で店に添付petTpPreviewとpetToAdapt proteryがなければならないという意味

it("returns the initial state by default",() => { 
    // In addition to dogs and cats, we need two more fields 
    expect(store.getState().petToPreview).to.be.an("object"); 
    expect(store.getState().petToAdopt).to.be.an("object"); 
    }); 

言います。これは、これら2つを次のように状態にボートとして追加することによって行うことができます。

​​

願っています!

+0

それは私の友人でした!それがとてもシンプルだったとは信じられない!それは実際には多くの 'を守ります//これらの犬と猫は私たちの初期状態にあります、 //しかし、必要なものがいくつかあります! また、ReduxでReactとSaveの状態を通常どおりに行うのと同じように、状態を保存するという精神的な移行だと思います。ありがとうございました! –

+0

ようこそ。あなたがその答えを気に入っていて、物事ははっきりしていますように。 – mindaJalaj

+0

本当に!結晶! –

1

switchステートメントのすべてのパスがreturnになります。つまり、最後から2番目の行のreturn initialStateに到達できません。 また、newStateは、prevStateのクローンに過ぎず、不要です。 それを削除し、いくつかのES6スプレッドの愛と組み合わせるswitchcaseのためのヘルパー関数を追加して、あなたのコードがなくなって、すべての混乱で

const switchcase = cases => defaultValue => key => 
    (key in cases ? cases[key] : defaultValue); 
const reducer = (state = initialState, action) => 
    switchcase({ 
    [PREVIEW_PET]: { ...state, petToPreview: action.pet }, 
    [ADOPT_PET]: { ...state, petToAdopt: action.pet }, 
    [ADD_NEW_DOG]: { ...state, dogs: [...state.dogs, action.dog] }, 
    [ADD_NEW_CAT]: { ...state, cats: [...state.cats, action.cat] }, 
    })(state)(action.type); 

が、それはあなたのコードはinitialStateを返すという事実に問題があることを紛れも明らかだなっオブジェクトの場合はaction.type === undefinedです。 initialStateオブジェクトにはdogscatsのプロパティしか含まれていませんが、テストではpetToPreviewpetToAdoptのプロパティがあると予想されます。

initialStateにこれらのプロパティを追加することも、必要な機能に応じてテストを変更することもできます。

0

デフォルトで以前の状態に戻すべきではありませんか?デフォルトでは、リデューサーはアクションを気にせず、単純に現在の状態を返します。これはあなたのケースではprevStateです。テストケースで

関連する問題