【发布时间】:2017-08-19 16:17:58
【问题描述】:
我刚开始玩 Jasmine,我还在为间谍/嘲笑的事情苦苦挣扎,例如,我有一个函数
module.exports = (() => {
....
function getUserInfo(id) {
return new Promise((resolve, reject) => {
redis.getAsync(id).then(result => {
resolve(result)
})
})
}
return { getUserInfo: getUserInfo }
})()
然后我开始编写 Jasmine 规范
describe('Test user helper', () => {
let userInfo
beforeEach(done => {
userHelper.getUserInfo('userid123')
.then(info => {
userInfo = info
done()
})
})
it('return user info if user is found', () => {
expect(userInfo).toEqual('info of userid 123')
})
})
它运行良好,但我的问题是如何模拟 redis.getAsync 调用,使其成为真正的独立单元测试?
谢谢。
【问题讨论】:
-
它是依赖测试用例。首先,您必须运行一个将一些数据插入到 redis 的测试用例。然后你必须运行这个测试用例
-
@AJS 那么它就不是单元测试了。
-
他想模拟redis,这是正确的方法
-
@Aluan Haddad 系统测试从端到端覆盖整个系统。单元测试可用于描述端到端循环的子部分。在这种情况下,您的单元测试您的应用程序代码的一部分将/可能不会命中数据库,但您将/可能有涵盖数据库存储过程的单元测试。基本上将您的应用程序划分为沿着有意义的分区进行测试的事物。如果您选择了错误的分区线,您最终会遇到模拟对象和测试脚手架之类的大代码维护问题。
-
@AJS 对,不同类型的测试针对不同的事物。模拟用于单元测试,模拟的主要用例是避免访问数据库。我同意您关于需要测试组件之间的交互以及单个组件的所有观点,但我在下面的回答描述了我认为使此功能可测试并对其进行测试的可靠方法,同时保留 api。
标签: javascript node.js unit-testing jasmine