specs2 + ScalaCheck:测试应该在单元规范中失败,但不是

时间:2015-05-13 18:48:40

标签: scala unit-testing scalacheck

我正在尝试将ScalaCheck集成到specs2中的单位规格中。我一定不知道它是如何工作的:

class TestCase extends PlaySpecification with ScalaCheck {
    "The container data model" should {
        val validIdRange = Gen.choose(1,GPDataTypes.integer._2)

        def chk(n: Int, d: Int) = {
            val g = new GPGlimple(n, true, true)
            g.accountId mustEqual 1 // should fail (actually equals n)
            g.id must beNone
            g.created must beNone
        }

        val idPairs = forAll(validIdRange, validIdRange) { (n: Int, d: Int) => chk(n, d) }
        "support basic glimple constructors" in {
            idPairs.check
        }
    }
}

但是,此测试执行没有失败。它绝对应该在'mustEqual 1'上失败(我故意改为1,它实际上等于n)。然而,测试结果中的结果......

[info] glimple容器数据模型应该 [info] +支持基本的glimple构造函数

1 个答案:

答案 0 :(得分:0)

好的,我们在关于.check的弃用以及ScalaCheck和specs2如何协同工作的几点之后想出来了。

这是我结束的地方:

class TestGlimpleModel extends PlaySpecification with ScalaCheck {
    "The glimple container data model" should {
        val validIdRange = Gen.choose(1, GPDataTypes.integer._2)
        val invalidIdRange = Gen.choose(GPDataTypes.integer._1, 0)
        val booleanRange = Gen.oneOf(true, false)

        "construct with valid id, created, and account parameters" in {
            forAll(validIdRange, validIdRange, booleanRange, booleanRange) { (n: Int, m: Int, b: Boolean, c: Boolean) =>
                ( Try { new GPGlimple(Option(GPID(n)), Option(new DateTime), GPID(m), b, c) } must beSuccessfulTry )
            }
        }

        "throw exceptions if the id or account parameters are invalid" in {
            forAll(invalidIdRange, invalidIdRange, booleanRange, booleanRange) { (n: Int, m: Int, b: Boolean, c: Boolean) =>
                 ( Try { new GPGlimple(Option(GPID(n)), Option(new DateTime), GPID(m), b, c) } must beFailedTry )
            }
        }
    }
}

也许不是最优雅的,但我刚刚开始使用ScalaCheck。这似乎更接近预期的API。

我创建了几个生成有效或无效ID随机集的生成器,以及一组随机的布尔值。然后,这两个测试用例尝试从Try {}中的数据创建我们的对象,并检查成功或失败(视情况而定)。

我还在研究的一件事是弄清楚如何生成随机的苏打时DateTime实例。还没有能够正确地得到语法......