scalamock / specs2:如果我没有断言怎么办?仅在 IsolatedMockFactory 中的期望
scalamock / specs2: What if I don't have assertions? Expectations only in IsolatedMockFactory
如果我在 Specs2 测试中实际上没有像 count must_== 1
a 这样的显式断言,我会收到一条错误消息,指示找不到隐式断言。
// doesn't compile
class Example extends Specification {
"You need an assertion" >> {
// hello!
}
}
很公平。
但如果我也使用 scalamock 的 MockContext
,我可以只依赖 expectations 而不是断言;模拟一些东西,scalamock 将验证方法被调用等;
class MockExample extends Specification {
"I can use 'expectations' here instead" in new MockContext {
val foo = mock[Foo]
(foo.bar _).expects(*).once
// no explicit assertions
}
}
但是,如果我尝试通过混入 IsolatedMockFactory
来共享上下文设置,我又会遇到编译器故障。有什么解决办法吗?
// doesn't compile
class AnotherMockExample extends Specification with IsolatedMockFactory {
val foo = mock[Foo]
"I can't use 'expectations' here any more" >> {
(foo.bar _).expects(*).once
}
}
specs2 中的示例接受任何具有 org.specs2.execute.AsResult
类型类实例的内容。由于 (foo.bar _).expects.once
是 CallHandler
类型,您可以为 CallHandler
创建一个 AsResult
实例,它只计算值和 returns Success
implicit def CallHandlerAsResult[R : Defaultable]: AsResult[CallHandler[R]] = new AsResult {
def asResult(c: =>CallHandler[R]) = {
c
Success
}
}
由于在 ScalaMock 中失败是基于异常的,如果不满足某些模拟期望,这应该会导致抛出异常。
如果我在 Specs2 测试中实际上没有像 count must_== 1
a 这样的显式断言,我会收到一条错误消息,指示找不到隐式断言。
// doesn't compile
class Example extends Specification {
"You need an assertion" >> {
// hello!
}
}
很公平。
但如果我也使用 scalamock 的 MockContext
,我可以只依赖 expectations 而不是断言;模拟一些东西,scalamock 将验证方法被调用等;
class MockExample extends Specification {
"I can use 'expectations' here instead" in new MockContext {
val foo = mock[Foo]
(foo.bar _).expects(*).once
// no explicit assertions
}
}
但是,如果我尝试通过混入 IsolatedMockFactory
来共享上下文设置,我又会遇到编译器故障。有什么解决办法吗?
// doesn't compile
class AnotherMockExample extends Specification with IsolatedMockFactory {
val foo = mock[Foo]
"I can't use 'expectations' here any more" >> {
(foo.bar _).expects(*).once
}
}
specs2 中的示例接受任何具有 org.specs2.execute.AsResult
类型类实例的内容。由于 (foo.bar _).expects.once
是 CallHandler
类型,您可以为 CallHandler
创建一个 AsResult
实例,它只计算值和 returns Success
implicit def CallHandlerAsResult[R : Defaultable]: AsResult[CallHandler[R]] = new AsResult {
def asResult(c: =>CallHandler[R]) = {
c
Success
}
}
由于在 ScalaMock 中失败是基于异常的,如果不满足某些模拟期望,这应该会导致抛出异常。