2015-05-11 21 views
1

如果我在Specs2测试中实际上没有明确的断言(如count must_== 1a),我会收到一个错误,指示没有隐式可找到。scalamock/specs2:如果我没有断言会怎么样?期望仅在IsolatedMockFactory中

// doesn't compile 
class Example extends Specification { 
    "You need an assertion" >> { 
    // hello! 
    } 
} 

不够公平。

但是,如果我也使用scalamock的MockContext,我可以只依靠期望而不是断言;模拟一些东西和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 
    } 
} 
+0

'(foo.bar _)的类型是什么?期望(*)。一次?您可以通过为该类型创建一个org.specs2.execute.AsResult实例来解决编译器错误。 – Eric

+0

太棒了,那让我做饭。谢谢。你想在答案中详细说明,我会将其标记为正确的?我建立了一个'AsResult',你基本上总是返回'Success';似乎有点闪避......有关它可能有多糟糕的任何想法?我的意思是,我为“单位”创建了一个似乎破坏整个精神的假设,假设限制在于鼓励使用断言。 – Toby

+0

我不认为你必须为Unit创建一个“全部抓取”AsResult实例,你只需要一个由ScalaMock表达式返回的类型的实例。顺便说一句,这将是一个很好的ScalaMock PR ... – Eric

回答

1

specs2中的示例接受任何具有org.specs2.execute.AsResult typeclass实例的内容。由于(foo.bar _).expects.onceCallHandler类型,你可以创建CallHandlerAsResult实例只是评估值,并返回Success

implicit def CallHandlerAsResult[R : Defaultable]: AsResult[CallHandler[R]] = new AsResult { 
    def asResult(c: =>CallHandler[R]) = { 
     c 
     Success 
    } 
} 

由于故障是例外,总部设在ScalaMock这将导致一个异常,如果一些模拟的期望是被抛出不满意。

+0

太好了,非常感谢:D – Toby

相关问题