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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions