Upsert реализации делегатов для обновления, но не делегировать для добавления - PullRequest
0 голосов
/ 27 апреля 2020

Я не привык к javascript или node.js. Это моя первая попытка отнестись к этому серьезно, так как мой работодатель попросил меня об этом. Кстати, вот мой код:

//meta-dao.js
class MetaDAO {
    async getAll() {
        return await Meta.find().exec()
    }
    async getByCatalogId(catalogId) {
        return await Meta.find().where(catalogId).in('catalogs').exec()
    }
    async getById(id) {
        return await Meta.findOne({ id }).exec()
    }
    async add(meta) {
        return await (new Meta(meta)).save()
    }
    async update(meta) {
        return await Meta.update({ id: meta.id }, meta).exec()
    }
    async upsert(meta) {
        var exists = await this.getById(meta.id)
        console.log(exists)
        if(!exists){
            return await this.add(meta)
        }
        else {
            return await this.update(meta)
        }
    }
}
//meta-dao.test.js
it('Should insert when upsert a meta with new id', async () => {
    metaDAO.getById = jest.fn((id) => {
        return Promise.resolve(meta)
    })
    metaDAO.getById.bind(metaDAO)

    metaDAO.upsert(meta)

    expect(metaDAO.add).toBeCalledTimes(1)
    expect(metaDAO.add).toBeCalledWith(meta)
    expect(metaDAO.getById).toBeCalledTimes(1)
    expect(metaDAO.getById).toBeCalledWith(meta.id)
    expect(metaDAO.update).not.toBeCalled()
})
it('Should update when upsert a meta with known id', async () => {
    metaDAO.getById = jest.fn((id) => {
        return Promise.resolve(null)
    })
    metaDAO.getById.bind(metaDAO)

    metaDAO.upsert(meta)

    expect(metaDAO.update).toBeCalledTimes(1)
    expect(metaDAO.update).toBeCalledWith(meta)
    expect(metaDAO.getById).toBeCalledTimes(1)
    expect(metaDAO.getById).toBeCalledWith(meta.id)
    expect(metaDAO.add).not.toBeCalled()
})

Все утверждения из второго теста пройдены. Но expect(metaDAO.add).toBeCalledTimes(1) из первого контрольного примера не удается. В console.log выводится «null», и я уже пытался использовать:

  • if(exists == null)
  • if(exists === null)
  • if(exists == undefined)
  • if(exists === undefined)
  • if(exists)

Кажется, это не имеет никакого значения. Поведение:

  • Обновление вызывается, если существует не ноль
  • Ничего не вызывается, если существует ноль

Что я делаю неправильно? Я что-то упустил?

1 Ответ

0 голосов
/ 30 апреля 2020

Мое издевательство было неверным. Вместо jest.fn() и fn.bind(object) я должен был использовать jest.spyOn и spy.mockRestore().

Следующий код исправлен и работает!

//meta-dao.test.js
beforeAll(() => {
    metaDAO = new MetaDAO()
})
it('Should insert when upsert a meta with new id', async () => {
    const addSpy = jest.spyOn(metaDAO,"add").mockImplementation(()=>{})
    const updateSpy = jest.spyOn(metaDAO,"update").mockImplementation(()=>{})
    const getIdSpy = jest.spyOn(metaDAO,"getById").mockImplementation((id) => {
        return Promise.resolve(null)
    })
    metaDAO.getById.bind(metaDAO)

    await metaDAO.upsert(meta)

    expect(addSpy).toBeCalledTimes(1)
    expect(addSpy).toBeCalledWith(meta)
    expect(getIdSpy).toBeCalledTimes(1)
    expect(getIdSpy).toBeCalledWith(meta.id)
    expect(updateSpy).not.toBeCalled()

    addSpy.mockRestore()
    updateSpy.mockRestore()
    getIdSpy.mockRestore()
})
it('Should update when upsert a meta with known id', async () => {
    const addSpy = jest.spyOn(metaDAO,"add").mockImplementation(()=>{})
    const updateSpy = jest.spyOn(metaDAO,"update").mockImplementation(()=>{})
    const getIdSpy = jest.spyOn(metaDAO,"getById").mockImplementation((id) => {
        return Promise.resolve(meta)
    })
    metaDAO.getById.bind(metaDAO)

    await metaDAO.upsert(meta)

    expect(updateSpy).toBeCalledTimes(1)
    expect(updateSpy).toBeCalledWith(meta)
    expect(getIdSpy).toBeCalledTimes(1)
    expect(getIdSpy).toBeCalledWith(meta.id)
    expect(addSpy).not.toBeCalled()

    addSpy.mockRestore()
    updateSpy.mockRestore()
    getIdSpy.mockRestore()
})

С другой стороны исходный код уже был в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...