【问题标题】:Jest is unable to detect the mock function callJest 无法检测到模拟函数调用
【发布时间】:2021-08-28 23:08:39
【问题描述】:

我正在为 Express 应用程序中的控制器编写单元测试。我在嘲笑res.send 方法,并希望在用户传递这样的有效数据时调用它:

describe('>> CONTROLLERS -- Exercise -- deleteExercise', () => {
  let res

  beforeEach(() => {
    res = {
      send : jest.fn()
    }
  });

  it('sends error as response if id was not passed', () => {
    const req = {
      body : {}
    }
    deleteExercise(req, res)

    expect(res.send).toHaveBeenCalledWith({
      error : 'please pass id field to delete the exercise.'
    })
  })

  it('calls the deleteExercise class method if the id was passed', () => {
    const req = {
      body : {
        id : 1234
      }
    }

    deleteExercise(req, res)

    expect(Exercise.deleteExercise).toHaveBeenCalledWith(1234)
    expect(res.send).toHaveBeenCalled()
    // expect(res.send).toHaveBeenCalledWith(mockData)
  })
})

第一个测试运行良好,但第二个不是。我添加了控制台来检查 res.send 是否被调用,在代码中它被调用,但 Jest 对 expect(res.send).toHaveBeenCalled() 测试失败。你能帮我解决我在这里缺少的东西吗...

【问题讨论】:

  • deleteExercise() 函数是什么样的?
  • @ArpanKc 它调用数据库并进行删除调用。并返回状态okay。但我现在已经嘲笑它返回一个空对象。
  • 给我们关于错误信息的信息。
  • @SubratoPatnaik 测试失败。错误表示未调用函数。
  • 如果您提供console.log 错误信息,对我的学习和理解会很有帮助。而且我不是那个否决这个问题的人

标签: javascript express jestjs


【解决方案1】:

在调试了一段时间后,我认为您还需要为您的模拟响应提供状态。

mockResponse = {
   send : jest.fn()
   status: jest.fn(() => mockResponse),
}
describe('>> CONTROLLERS -- Exercise -- deleteExercise', () => {
  let mockResponse

  beforeEach(() => {
    mockResponse = {
      send : jest.fn()
      status: jest.fn(() => mockResponse),
    }
  });

  afterEach(() => {
    jest.clearAllMocks();
  });

  it('sends error as response if id was not passed', () => {
    const mockRequest = {
      body : {}
    }
    deleteExercise(mockRequest, mockResponse)

    expect(mockResponse.send).toHaveBeenCalledWith({
      error : 'please pass id field to delete the exercise.'
    })
  })


  it('calls the deleteExercise class method if the id was passed', () => {
    const mockRequest = {
      body : {
        id : 1234
      }
    }

   deleteExercise(mockRequest, mockResponse)
 // deleteExercise is called with req, res arguments

    expect(Exercise.deleteExercise).toHaveBeenCalled()
    expect(Exercise.deleteExercise).toHaveBeenCalledWith(mockRequest, mockResponse) 
    expect(Exercise.deleteExercise).toHaveBeenCalledTimes(1)
    expect(mockResponse.send).toHaveBeenCalled()
    expect(mockResponse.send).toHaveBeenCalledWith(1234)
    expect(mockResponse.send).toHaveBeenCalledTimes(1)

  })
})

deleteExercise 函数使用resreq 调用,而不是id。 首先,检查是否调用了 deleteExercise,然后检查是否使用参数调用了相同的函数。然后检查该函数被调用了多少次。

还有一件事,在每个测试用例之后清除所有模拟。

afterEach(() => {
    jest.clearAllMocks();
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多