我发现Karma js测试的设置和编写有些麻烦,并且发现自己经常因此而忽略编写测试,所以我想知道是否存在更好的替代方案。
由于我使用 typescript ,我的梦想场景是如果我能写这样的东西:
module adder {
export function add(a, b){
return a + b;
}
}
[Tests]
assert.equal(4, adder.add(2, 2));
我的测试是内联的,当当前文件发生更改时,将直接在我的编辑器中运行。由于typescript可以很容易地从最终输出中删除测试,我可以将我的测试放在与代码相同的文件中(在我看来,越接近越好)。任何测试框架都支持这一点吗?如果没有,需要什么来支持此场景?
2条答案
按热度按时间piok6c0g1#
只是一个学究式的注解-- Karma是一个测试运行器,而不是一个测试框架。然而,它可以使用Jasmine、Mocha、QUnit或自定义测试框架。
你可以使用装饰器语法来完成这种类型的行为。
尽管如此,测试代码的结构与Jasmine语法非常相似:
您的理想,即:
使用TypeScript装饰器,甚至泛型都是不可能的。您正在尝试将属性应用于任意代码行。这必须是一个用于启动的函数,以便正确使用JavaScript作用域规则:
mspsb9vt2#
我认为任何声明测试为普通函数或对象的框架都可以支持内联测试。你可以像blorkfish的回答那样在被测试的代码旁边声明Jasmine语法的测试。但是我不认为框架是必要的。
值得记住的是,Type/JavaScript文件中的顶级语句是在导入时执行的(除非是仅类型导入)。因此,您可以将测试函数或对象添加到测试的全局列表中。一旦所有模块都已导入,您就可以运行测试了。
例如,假设我们有
lib/test.ts
然后我们可以定义这样的测试
然后,我们需要加载并执行所有测试,这是应用程序健康检查的一部分,也就是说,当向
/sys/health
发出GET请求时,将运行类似下面的代码类似的代码也可以用在客户端。如果用户遇到客户端错误,你可以在错误页面的后台自动运行客户端测试。运行的测试将取决于包含的模块。
这样做的缺点是测试代码将与普通代码一起包含。如果你在生产环境中运行单元测试作为健康检查,这不是问题。而且大多数捆绑包支持“defines”和死代码消除,所以你可以从生产代码中删除它们(例如https://esbuild.github.io/api/#define)。