为什么我不能测试 class 的实例是否已定义
Why can't I test that a class's instance is defined
我有一个助手 class 可以创建另一个 class
的实例
class TestEnv {
val questionsController = new QuestionsController(...)
}
我正在进行单元测试QuestionsController
并且已经创建了一个基本测试用例
class QuestionsControllerUnitSpec extends PlaySpec with BeforeAndAfterAll with BeforeAndAfterEach with OneAppPerSuiteWithComponents{
override def beforeEach() = {
println("------------new test -----------------")
}
override def components: BuiltInComponents = new BuiltInComponentsFromContext(context) with NoHttpFiltersComponents {
import play.api.mvc.Results
import play.api.routing.Router
import play.api.routing.sird._
lazy val router: Router = Router.from({
case GET(p"/") => defaultActionBuilder {
Results.Ok("success!")
}
})
}
"Question Controller " should {
"be created" in {
val testEnv = new TestEnv(components = components)
val qc:QuestionsController = testEnv.questionsController
qc mustBe defined //I get compilation error
}
}
}
我得到以下编译错误
Error:(52, 10) could not find implicit value for parameter definition: org.scalatest.enablers.Definition[controllers.QuestionsController]
qc mustBe defined
Error:(52, 10) not enough arguments for method mustBe: (implicit definition: org.scalatest.enablers.Definition[controllers.QuestionsController])org.scalatest.Assertion.
Unspecified value parameter definition.
qc mustBe defined
我检查了MustMatchers.class
中mustBe
的定义。它被定义为 def mustBe(right : org.scalatest.words.DefinedWord)(implicit definition : org.scalatest.enablers.Definition[T]) : org.scalatest.Assertion = { /* compiled code */ }
为什么我会收到错误消息。
如果可以提供更准确的答案,我很乐意接受不同的答案。我想我正在测试错误的东西。我所做的类似于声明一个整数并检查该整数是否存在!相反,我应该检查整数的值。
关于 matchers
,更多信息在 http://doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers. More information on Definition
is on http://doc.scalatest.org/3.0.1/#org.scalatest.enablers.Definition
如果我们提供 Definition
特性的隐式实现,defined
匹配器语法可以与用户定义的类型一起使用。例如,假设我们有一个用户定义的 class
class Foo {
val bar = 3
}
我们提供隐式定义
implicit val fooDefinition = new Definition[Foo] {
override def isDefined(foo: Foo): Boolean = foo.bar != null
}
然后我们可以使用defined
语法
(new Foo()) mustBe defined
如果提供了 Definition[QuestionsController]
的类似隐式实现,则应该解决编译器错误。
我有一个助手 class 可以创建另一个 class
的实例class TestEnv {
val questionsController = new QuestionsController(...)
}
我正在进行单元测试QuestionsController
并且已经创建了一个基本测试用例
class QuestionsControllerUnitSpec extends PlaySpec with BeforeAndAfterAll with BeforeAndAfterEach with OneAppPerSuiteWithComponents{
override def beforeEach() = {
println("------------new test -----------------")
}
override def components: BuiltInComponents = new BuiltInComponentsFromContext(context) with NoHttpFiltersComponents {
import play.api.mvc.Results
import play.api.routing.Router
import play.api.routing.sird._
lazy val router: Router = Router.from({
case GET(p"/") => defaultActionBuilder {
Results.Ok("success!")
}
})
}
"Question Controller " should {
"be created" in {
val testEnv = new TestEnv(components = components)
val qc:QuestionsController = testEnv.questionsController
qc mustBe defined //I get compilation error
}
}
}
我得到以下编译错误
Error:(52, 10) could not find implicit value for parameter definition: org.scalatest.enablers.Definition[controllers.QuestionsController]
qc mustBe defined
Error:(52, 10) not enough arguments for method mustBe: (implicit definition: org.scalatest.enablers.Definition[controllers.QuestionsController])org.scalatest.Assertion.
Unspecified value parameter definition.
qc mustBe defined
我检查了MustMatchers.class
中mustBe
的定义。它被定义为 def mustBe(right : org.scalatest.words.DefinedWord)(implicit definition : org.scalatest.enablers.Definition[T]) : org.scalatest.Assertion = { /* compiled code */ }
为什么我会收到错误消息。
如果可以提供更准确的答案,我很乐意接受不同的答案。我想我正在测试错误的东西。我所做的类似于声明一个整数并检查该整数是否存在!相反,我应该检查整数的值。
关于 matchers
,更多信息在 http://doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers. More information on Definition
is on http://doc.scalatest.org/3.0.1/#org.scalatest.enablers.Definition
Definition
特性的隐式实现,defined
匹配器语法可以与用户定义的类型一起使用。例如,假设我们有一个用户定义的 class
class Foo {
val bar = 3
}
我们提供隐式定义
implicit val fooDefinition = new Definition[Foo] {
override def isDefined(foo: Foo): Boolean = foo.bar != null
}
然后我们可以使用defined
语法
(new Foo()) mustBe defined
如果提供了 Definition[QuestionsController]
的类似隐式实现,则应该解决编译器错误。