Skip to content

提案:test 功能提供 log 录制 #35

@Gaubee

Description

@Gaubee

我们经常会写这种测试:

console.log(await call1())
console.log(await call2())

如果以常规的测试写法,应该是:

defineTest('call', ()=>{
  t.eq(await call1(), 1)
  t.eq(await call2(), 2)
})

所以符合开发者直觉的应该是这样:

defineTest('call', (t) => {
  // 进行日志匹配测试
  t.traceLog({methods:['log','info','warn','error']})
  // 这里全局的 console.log/info/warn/error 会被替换,也就是说call1里头的其它函数如果也调了console,也会被记录下来
  // 此时应该尽可能避免打印 时间、随机内容,如果非要打印,可能可以使用 console.noTrace.log(new Date) 这样的方式来绕过
  console.log(await call1())
  console.log(await call2())
})

此时,直接执行该测试:

bfsp test call

如果: test/assets/log/call.log 不存在,那么会默认创建该文件
如果: test/assets/log/call.log 存在,那么会比对该文件中的日志输出,如果一致


这种方案还有一个问题,就是console这个对象。并不适用于每一个项目。
所以我们可能可以简单地换一种写法:

// 定义“日志型”测试
defineLogTest('call', (t) => {
  t.log(await call1())
  t.log(await call2())
})

如果想将日志污染到全局,那么未来也许可以使用代码宏来进行操作:

//#macro log
const log = globalThis.TEST_ENV ? (...fields) => {
   return ts`globalThis.test.logger.log(${fields})`
} : (...fields) => {
   return ts`console.log(${fields})`
}
//#endmarco

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions