在测试函数中模拟其他模块
Mocking other module within tested function
我的 testService
有一个单元测试。我调用函数 create
,它调用另一个子函数 save
,将数据镜像 (apiService.send
) 到国家服务器。在我的单元测试中,我不想测试与服务器的连接等,所以我想模拟函数 apiService.send
而不是总是 return 某个值。但是我还是想保留剩下的保存功能,因为我真的很想检查是否所有的东西都保存在数据库中。
据我所知 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)
可以使用模块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
我的 testService
有一个单元测试。我调用函数 create
,它调用另一个子函数 save
,将数据镜像 (apiService.send
) 到国家服务器。在我的单元测试中,我不想测试与服务器的连接等,所以我想模拟函数 apiService.send
而不是总是 return 某个值。但是我还是想保留剩下的保存功能,因为我真的很想检查是否所有的东西都保存在数据库中。
据我所知 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)
可以使用模块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