Egg.js 内service层的 ctx.throw 单元测试代码应该怎样写?
发布于 7 年前 作者 thomas0836 4989 次预览 最后一次回复是 7 年前 来自 问答
参考了 egg-RESTfulAPI 写的RESTfulAPI 样例,里面没有单元测试代码学习。
然后自己写单元测试代码,写到 service层的 ctx.throw 就卡住了。
ctx.throw 到底有没有抛出异常
用assert.doesNotThrow 来断言是可以通过测试
npm test
用assert.throws 来断言是不可以通过测试,但是我一直怀疑是第二个参数的对象写得不对
npm test
直接运行是不能到下一个断言,感觉是给抛出异常了
npm test
对doesNotThrow 测试过,是第一个参数block 内没有抛出异常是才会通过断言,那直接运行的时候抛出来的是什么? 求大大指导一下,最好提供一下你们在面对这种单元测试的时候是怎么写的。
9 回复
可以用 https://github.com/node-modules/assert-extends
对应的 Service,其实可以直接
throw不用ctx.throw你截图中的报错跟 assert throw 应该关系不大,而是你的 user 没挂载成功,上面看你有一句 factory 很奇怪。 最好提供下最小可复现仓库看看。
根据我上面说的自己排查下吧。
刚才提到了,应该不是测试这块的问题,你先查下为啥 user 是 undefined 吧。
另外,提供可复现仓库的意思不是截图。。。
感谢 @atian25 查了一下egg.js的 assert 是用 power-assert 的,目测是没有 assert-extends 内的 asyncThrows 方法,换成您的这个方式基本解决问题,power-assert 的 throws 不兼容 async 的方法,所以是捕获不到那个异常。
然后目前遇到一个新的情况。可以麻烦您帮忙看看吗?
我现在想对这个update方式内的422 那个异常做单元测试,在没有捕捉之前提示的异常情况是这样的
这里我也按照了您建议的正则的方式来写,但是还是不行。
更奇怪的是,同样的代码我在另外一个create 方式内也有,但是哪里就测试通过。我更是多次复制,过去还是一样的不能正确的断言到那个异常。这是为什么呢?
return assert.asyncThrows()orawait assert.asyncThrows()assert.asyncThrows()返回的是一个 Promise,如果你没 await 或 return 的话,mocha 的测试根本来不及等待它。@atian25 哈哈哈原来是要这样! 谢谢
@atian25 弱弱地问一下
middleware 层的类似这样的 方法该怎么写单元测试? mock 可以模拟app运行异常吗?对应的测试思路应该是怎样?
你可以在 test 的 before 里面手动注册一个路由