2013-03-29 27 views
0

我有一個場景,我想在功能測試期間重寫某些控制器,以便在運行時模擬控制器被調用。我可以很容易地覆蓋服務,這樣resources.groovy:(記錄herehere如何根據環境重寫resources.groovy中的控制器?

// grails-app/conf/spring/resources.groovy 
beans = { 
    switch(Environment.current) { 
     case Environment.TEST: 
      expensiveToUseService(MockExpensiveToUseService) 

      break 
    } 
} 

這種方法重定向到正確時,應用程序是在測試環境中運行的模擬服務。

但是,與控制器一起使用的方法不起作用。這是我的當前的嘗試:

// grails-app/conf/spring/resources.groovy 
beans = { 
    switch(Environment.current) { 
     case Environment.TEST: 
      expensiveToUseController(MockExpensiveToUseController) 

      break 
    } 
} 

的嘲笑控制器是在相同的目錄/包作爲原始,下的grails-app /控制器。

我可以看到的唯一明顯區別是我的服務在代碼中由使用它們的控制器明確引用,例如,

class ExpensiveToUseController { 
    def expensiveToUseService 
... 
} 

另一方面,控制器只能被Grails運行時引用。

值得一提的是,我沒有選擇將邏輯移出現有的控制器到服務中,這將提供解決方法。

有沒有我在這裏失蹤的東西,還是有另一種方式實現呢?

編輯:請參閱下面的答案。

對於遇到此問題的其他人,我不需要額外的bean.scope/autowire參數。這是我的DSL:

beans = { 
switch(Environment.current) { 
    case Environment.TEST: 
     'com.example.ExpensiveToUseController'(com.example.MockExpensiveToUseController) 

     break 
    } 
} 

回答

2

由於他們並非是autowireable,控制器在春天上下文匹配的完全限定類名稱的bean的名字註冊的,而不是「屬性名稱」再現所使用服務。所以你需要註冊你的測試豆com.example.ExpensiveToUseController而不是expensiveToUseController

但是,將環境檢查放在控制器本身的「昂貴」操作中可能會更容易。我認爲實例化控制器不能太昂貴,因爲控制器默認情況下是原型範圍。

+0

感謝您的建議。我已經嘗試過了,現在重新嘗試,但不起作用。我得到以下錯誤: 「groovy.lang.MissingPropertyException:沒有這樣的屬性:com類:資源」 我寧願不把環境檢查內控制器,我想保留我的測試代碼完全分開。 – eustachio

+1

@eustachio你必須在beans中引用它:''com.example.ExpensiveToUseController'(MockExpensiveToUseController){bean - > bean.scope ='prototype'; bean.autowire ='byName'}' –

+0

很好,工作,謝謝! – eustachio