如何使用 Jasmine2 测试链式 Knex 方法(/承诺)?

How to test chained Knex methods(/promises) with Jasmine2?

如何使用 Jasmine2 测试链式 Knex 方法?


我有以下 class 和规格:

任务class

class Task {
    // ...
    findBy(field, value) {
        return this.Knex(this.tableName).where(field, value)
    }
    // ...
}

任务规范

// ...
beforeEach(() => {
    task = new Task()

    spyOn(task, 'Knex').and.returnValue(Q.when({}))
    spyOn(task.Knex, 'where').and.returnValue(Q.when({})) // <<< Wrong (where() isn't part of Knex anymore)
})

it('should expose findBy()', () => {
    let field = 'id'
      , value = 1

    task.findBy(field, value)
    expect(task.Knex).toHaveBeenCalledWith(task.tableName)
    expect(task.Knex.where).toHaveBeenCalledWith(field, value)
})
// ...

我收到的错误信息是:

TypeError: this.Knex(...).where is not a function

第一个 spyOn() 中的 return 有错误。 return 是一个没有 where() 的承诺。

这解决了问题(但失去了第一个 spyOn()

的承诺 return
beforeEach(() => {
    task = new Task()

    knexRes = (spyOn(task, 'Knex').and.returnValue(({
        where: function() {}
    })))()

    spyOn(knexRes, 'where').and.returnValue(Q.when({}))
})

it('should expose findBy()', () => {
    let field = 'id'
      , value = 1

    task.findBy(field, value)
    expect(task.Knex).toHaveBeenCalledWith(task.tableName)
    expect(knexRes.where).toHaveBeenCalledWith(field, value)
})