Kotlin &引用;表达式是未使用的";在intellij中使用kotest时
使用Kotest编写的这个kotlin测试,IntelliJ显示警告“表达式未使用”,语法着色不起作用。 此外,在运行测试时,找不到该测试Kotlin &引用;表达式是未使用的";在intellij中使用kotest时,kotlin,intellij-idea,kotest,Kotlin,Intellij Idea,Kotest,使用Kotest编写的这个kotlin测试,IntelliJ显示警告“表达式未使用”,语法着色不起作用。 此外,在运行测试时,找不到该测试 class TalentMatchServiceSpec:StringSpec(){ 初始化{ “将3添加到2应得到5” { //给定整数2和3 val 2=2 瓦尔三=3 //两个数字相加时 瓦尔和=2+3 //那么结果是5 总数应该是5 } } } 只需将开头的花括号放在“3加2等于5”之后,如下所示: class TalentMatchServiceS
class TalentMatchServiceSpec:StringSpec(){
初始化{
“将3添加到2应得到5”
{
//给定整数2和3
val 2=2
瓦尔三=3
//两个数字相加时
瓦尔和=2+3
//那么结果是5
总数应该是5
}
}
}
只需将开头的花括号放在“3加2等于5”之后,如下所示:
class TalentMatchServiceSpec:StringSpec(){
初始化{
“将3添加到2应得到5”{
//给定整数2和3
val 2=2
瓦尔三=3
//两个数字相加时
瓦尔和=2+3
//那么结果是5
总数应该是5
}
}
}
@Thomas Martin的答案是正确的,但你问为什么会有不同
Kotest中的SpringSpec
依赖于一些Kotlin DSL特性来工作。让我们从头开始构建相同的函数来进行演示
我们将从使用Kotlin的扩展函数开始。这允许我们向不受控制的类添加函数
所以
因此,我们可以对任何字符串调用此测试函数:
"this is a test".test({ 1 + 2 shouldBe 3 })
其次,Kotlin允许将任何最终lambda arg带到parens之外。所以foo(arg,arg2,arg3,lambda)
可以变成foo(arg,arg2,arg3)lambda
。这意味着我们可以将测试编写为:
"this is a test".test { 1 + 2 shouldBe 3 }
接下来,我们可以将函数标记为中缀,然后不需要使用点来调用它们。因此,我们的测试功能变成:
infix fun String.test(test: () -> Unit)
我们的测试现在看起来像:
"this is a test" test { 1 + 2 shouldBe 3 }
operator fun String.invoke(test: () -> Unit)
最后,任何名为invoke
并标记为运算符函数的函数都可以在不使用函数名的情况下调用。因此,类Foo中的操作符fun invoke(a:String,b:String)
可以作为常规的Foo.invoke(a,b)
或仅仅Foo(a,b)
调用
因此,将所有这些放在一起,我们的最终测试函数如下所示:
"this is a test" test { 1 + 2 shouldBe 3 }
operator fun String.invoke(test: () -> Unit)
我们的测试结果如下:
"this is a test" { 1 + 2 shouldBe 3 }
或者更有可能
"this is a test" {
1 + 2 shouldBe 3
}
如果大括号移动到下一行,就像在原始问题中一样,它看起来就像一个字符串,后面跟着一个不相关的lambda块。两种不同的表达方式。你能解释一下为什么会有不同吗?我有点希望其他人诚实。明天我会更努力地去理解为什么。