我有一個場景,我想在功能測試期間重寫某些控制器,以便在運行時模擬控制器被調用。我可以很容易地覆蓋服務,這樣resources.groovy:(記錄here和here)如何根據環境重寫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
}
}
感謝您的建議。我已經嘗試過了,現在重新嘗試,但不起作用。我得到以下錯誤: 「groovy.lang.MissingPropertyException:沒有這樣的屬性:com類:資源」 我寧願不把環境檢查內控制器,我想保留我的測試代碼完全分開。 – eustachio
@eustachio你必須在beans中引用它:''com.example.ExpensiveToUseController'(MockExpensiveToUseController){bean - > bean.scope ='prototype'; bean.autowire ='byName'}' –
很好,工作,謝謝! – eustachio