2017-04-26 47 views
0

使用的Grails 3.2.8和用於測試的斯波克框架,給出下面的控制器類:如何測試是否一個實例方法是從另一個實例方法中調用Grails中使用3斯波克

class SomeController { 
    def doSomething() { 
     // do a few things, then: 
     someOtherMethod() 
    } 

    protected void someOtherMethod() { 
     // do something here, but I don't care 
    } 
} 

我該如何測試doSomething()方法以確保someOtherMethod()只被調用一次?

這是我的嘗試失敗:

@TestFor(SomeController) 
class SomeControllerSpec extends Specification { 
    void "Test that someOtherMethod() is called once inside doSomething()"() { 
     when: 
     controller.doSomething() 

     then: 
     1 * controller.someOtherMethod(_) 
    } 
} 

錯誤消息:

Too few invocations for: 

1 * controller.someOtherMethod(_) (0 invocations) 

注:專注於手頭的問題進口量已經省略

+1

你肯定someOtherMethod()應​​該是控制器的方法,而不是服務的方法?一般來說,我會說控制器內的受保護的方法可能是可疑的。如果不瞭解你方法的目的,我不可能說。但是,如果它是一種服務方法,那麼使用模擬框架應該可以方便地計算方法調用。 – augustearth

回答

0

你不能這樣做,因爲控制器不是一個模擬編輯對象。相反,你需要使用元類是這樣的:

@TestFor(SomeController) 
class SomeControllerSpec extends Specification { 
    void "Test that someOtherMethod() is called once inside doSomething()"() { 
     given: 
      Integer callsToSomeOtherMethod = 0 
      controller.metaClass.someOtherMethod = { 
       callsToSomeOtherMethod++ 
      } 
     when: 
      controller.doSomething() 

     then: 
      callsToSomeOtherMethod == 1 
    } 
} 
相關問題