我目前正在做最高尚的编程工作,为Json编码/解码编写测试。我将Argonaut.io用于Json
和Scalatest用于我的测试框架。在scalatest下,在断言验证期间使用===
会在发生故障时提供其他信息,而使用==
只会提供此org.scalatest.exceptions.TestFailedException was thrown.
。但是,scala编译器并不满意。这是代码:
val default = new Broadcast("default", "default", "default")
test("Should parse out network when present") {
val hcursor = testHCursor(jsonPath + "complete-broadcast.json")
val actualNetwork = Parser.BroadcastDecodeJson(hcursor)
.getOr(default)
.network
assert(actualNetwork === "ESPNU")
}
这喷出了这个:
[info] Compiling 1 Scala source to /home/vagrant/waltercamp/waltercamp-dataservice/target/scala-2.10/test-classes...
[error] /home/vagrant/waltercamp/waltercamp-dataservice/src/test/scala/io/ptx/waltercamp/schedules/BroadcastParserSuite.scala:16: type mismatch;
[error] found : actualNetwork.type (with underlying type String)
[error] required: ?{def ===(x$1: ? >: String("ESPNU")): ?}
[error] Note that implicit conversions are not applicable because they are ambiguous:
[error] both method ToEqualOps in trait ToEqualOps of type [F](v: F)(implicit F0: scalaz.Equal[F])scalaz.syntax.EqualOps[F]
[error] and method convertToEqualizer in trait Assertions of type (left: Any)BroadcastParserSuite.this.Equalizer
[error] are possible conversion functions from actualNetwork.type to ?{def ===(x$1: ? >: String("ESPNU")): ?}
[error] assert(actualNetwork === "ESPNU")
[error] ^
[error] one error found
[error] (test:compile) Compilation failed
然而,使用==
提供了一个干净的编译和传递。有没有办法为编译器提供关于使用哪个转换或转换顺序的提示?
答案 0 :(得分:2)
我会在这里使用ScalaTest的版本。一种方法是明确应用转换:
assert(convertToEqualizer(actualNetwork) === "ESPNU")
但是,如果您在文件中多次使用===
,那么这会有很多不愉快的样板。另一种方法是从一般导入中排除Scalaz转换:
import scalaz._, Scalaz.{ ToEqualOps => _, _ }
您还可以切换到Scalaz的单点导入,并确保不通过ToEqualOps
提取scala.syntax.equal._
。我承认我发现点菜进口有时会产生很大的痛苦,但是如果你在测试中对Scalaz做的不多,那就不会太糟糕了。