【问题标题】:Mocking other module within tested function在测试功能中模拟其他模块
【发布时间】:2015-10-07 09:28:20
【问题描述】:

我的testService 有一个单元测试。我调用一个函数create,它调用另一个子函数save,它将数据镜像(apiService.send)到国家服务器。在我的单元测试中,我不想测试与服务器的连接等,所以我想模拟函数apiService.send,而是总是返回一个特定的值。但我还是想保留保存功能的其余部分,因为我真的很想检查数据库中的所有内容是否保存完好。

据我所知Jasmine - How to spy on a function call within a function? 这可以通过 and.callThrough 实现

测试

testService.createTest(appUser, testData, (err, test) ->
  expect(err).toBe(null)
  ...

功能

saveTest = (test, method, appUserToken, callback) ->
  async.parallel
    local: (next)->
      test.save((err) ->
        return next err if err?
        return next null, test._id
      )
    national: (next)->
      apiService.send(environment, method, test, appUserToken, (err, testId) ->
        return next err if err?
        TestModel.update({_id: test._id},  { $set: { refId: new Object(testId) }}, (err, result) ->
          return next err if err?
          return next 'Referenz Id wurde nicht gespeichert' if result.nModified==0
          return next null, test._id
        )
      )
    (err, results)->
      return callback err if err?
      return callback null, results.local


exports.createTest = (appUser, testData, callback) ->
  ...
  saveTest(newTest, 'createTest', appUser.token, callback)

【问题讨论】:

标签: node.js unit-testing jasmine


【解决方案1】:

可以使用模块proxyquire(https://github.com/thlorenz/proxyquire)来实现解决方案:

proxyquire =  require('proxyquire').noCallThru()
apiServiceStub = {}

通过 proxyquire 要求您的原始模块。对于要覆盖的模块,使用与原始模块相同的路径很重要。在这种情况下:../api/api.service.js

testService = proxyquire(applicationDir + 'backend/test/test.service.js', '../api/api.service.js': apiServiceStub)

写一个假函数

apiServiceStub.send = (environment, method, data, token, callback) ->
  console.log "I'm a fake function"
  return callback null, testDummies.SUPERADMIN_ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2022-11-02
    • 2018-07-17
    • 2020-12-12
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多