代码之家  ›  专栏  ›  技术社区  ›  xyzzyrz

ScalaTest语法是如何工作的?

  •  3
  • xyzzyrz  · 技术社区  · 16 年前

    我用Scala做过一些编程,我知道,例如。,

    xs map f
    

    xs.map(f)
    

    但我不知道如何将这种语法推广到类似ScalaTest的语法,例如。,

    it should "throw NoSuchElementException if an empty stack is popped" in {
      val emptyStack = new Stack[String]
      evaluating { emptyStack.pop() } should produce [NoSuchElementException]
    }
    

    我主要想知道那些看起来像多词结构的东西,即 should produce . 它很整洁。

    2 回复  |  直到 16 年前
        1
  •  13
  •   JamesFaix    7 年前

    xs map f
    

    指:

    xs.map(f)
    

    但你可以更进一步说:

    xs map f map g
    

    这意味着:

    xs.map(f).map(g)
    

    result should not be null
    

    由编译器将其解压缩为:

    result.should(not).be(null)
    

    这:

    it should "throw an exception" in { ... }
    

    it.should("throw an exception").in { ... }
    

    最后的大括号实际上只是一种将代码(测试代码)传递到in方法中的方法,包装为no-arg函数。所以所有这些都是相同的想法。连续使用两次的运算符符号。

    你问的最后一个问题有点不同:

    evaluating { ... } should produce [IllegalArgumentException]
    

    evaluating { ... } should 应该 evaluating . 什么 应该 实际上,takes是调用 produce 生产 实际上是一个方法,它有一个类型参数,例如 [IllegalArgumentException] 生产 这可以提供 java.lang.Class 举例 IllegalArgumentException 评价 ,以及找到 java.lang.Class try ,捕获异常,并将其与预期进行比较。如果没有抛出异常,或者抛出了错误的异常,则 应该 方法抛出一个 TestFailedException 应该

    所以,答案是,线被去除成:

    (evaluating { ... }).should(produce[IllegalArgumentException] (compilerSuppliedManifest))
    

    这个故事的寓意是,像这样的高级代码更容易理解程序员的意图,但通常更难理解代码的实际工作方式。大多数时候,在实践中,你所关心的只是意图,但有时你需要知道事情是如何运作的。在这种情况下,在Scala中,您可以通过 -Xprint:typer 作为Scala编译器的命令行参数,它将在所有的去语法处理完成后打印出文件的一个版本。所以你可以在需要的时候看到什么是什么。

        2
  •  2
  •   oxbow_lakes    16 年前

    这相当简单,因为它是普通代码- it should 相当于 it.should 因此,必须有一个值(或方法)被调用 it 在范围内。及 there is

    此变量的类型为 ItWord 它公开了一个名为 should BehaveWord ShouldMatchers trait .

    ScalaTest 实际上是 非常有记录 有大量的例子和关于事物如何运作的描述。

    推荐文章