我正在继续我的Stack-Overflow驱动的测试DSL编程 - 感谢迄今为止所有贡献者!
目前我的DSL读起来像这样
scenario("Incorrect password") {
given("user visits", the[AdminHomePage])
then(the[SignInPage], "is displayed")
when("username", "admin", "and password", "wrongpassword", "are entered")
then(the[SignInPage], "is displayed")
and("Error message is", "Sign in failed")
}
给出,何时然后是采用Any
的方法,所以当这样调用时,它们会传递一个参数元组 - Why and how is Scala treating a tuple specially when calling a one arg function?。
理想情况下,我会删除逗号,以便它读得更好,只用空格分隔标记
scenario("Incorrect password") {
given("user visits" the[AdminHomePage])
then(the[SignInPage] "is displayed")
when("username" "admin" "and password" "wrongpassword" "are entered")
then(the[SignInPage] "is displayed")
and("Error message is" "Sign in failed")
}
任何人都可以想到任何可以让我实现这一目标的技术,或者它对于内部DSL来说太过分了吗?
答案 0 :(得分:1)
不,您不能从空格分隔的标记创建元组(尽管您可以使用自定义运算符作为分隔符而不是逗号)。你可以做的是使用这样的无点语法:
obj method obj method obj ...
许多DSL实现(如规范)利用此语法创建更多“类文本”语法。
答案 1 :(得分:1)
您需要“令牌”之间的方法/运算符。对于对,已经有->
,例如
println("hello" -> 12 -> '!' -> 12.0)
//--> (((hello,12),!),12.0)
答案 2 :(得分:1)
不确定它是否有效:
如前所述,您可以在运算符表示法中调用一个参数方法。动态特征还允许动态调用方法:http://www.scala-lang.org/api/current/index.html#scala.Dynamic
因此,如果您从实现动态特征的对象开始,它可能会起作用..