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

时间:2016-01-11 23:55:55

标签: javascript node.js jasmine knex.js

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

我有以下课程和规范:

任务类

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

1 个答案:

答案 0 :(得分:0)

从第一个spyOn()返回错误。返回是一个承诺,没有where()作为其中的一部分。

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

返回的承诺
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)
})