2013-05-20 199 views
0

我在src/groovy測試Grails的控制器具有來自SRC豆/常規

class Something { 
    def foo 
} 

這是resources.groovy

beans = { 
    mySomething(Something) 
} 

在我的控制器類我用這個:

class MyController { 
    def mySomething 
    def index() { 
    mySomething.foo = "bar" 
    render mySomething.foo 
    } 
} 

我該如何測試?

@TestFor(MyController) 
    class MyControllerSpecification extends Specification { 
    def "test bean" 
    given: 
     controller.mySomething = new Something() //is this the best way? 
    when: 
     controller.index() 
    then 
     response.contentAsString == "bar" 
    } 

問題

這是測試的最佳方式?我通常會看到爲類創建的Mocks。 Mocks有什麼好處,我應該在這裏使用它們嗎?

回答

1

如果這比創建新實例和填充依賴關係更快,則可以使用服務的模擬實現。

有時您可以擁有複雜的服務,這取決於其他服務,並且設置所有必需結構的努力很高,那麼您可以使用Grails mockFor()方法,只是模擬您將使用的特定方法。

Grails docs告訴你如何模擬將在你的單元測試中使用的類。

在你的例子中,我沒有看到優勢,因爲Something只是foo的持有者。

1

您可以使用自SomethingdefineBeans(參見Testing Spring Beans),而setUpgiven已被宣佈爲beanresources.groovy

defineBeans{ 
    mySomething(Something){bean -> 
     //To take care of the transitive dependencies inside Something 
     bean.autowire = true 
    } 
} 
+0

+1。 'defineBeans'是另一種方式,但在Grails 2.2.2之前,如果使用'grailsApplication.mainContext.getBean()',你的模擬bean沒有在主要上下文中註冊。 –

+0

我記得你的[建議改進](http://jira.grails.org/browse/GRAILS-9980)我的朋友。感謝您提出這個問題。 :) – dmahapatro

+0

一旦將它分配給'controller'成員,我幾乎不會從'mainContext'獲取bean。因爲在這種情況下,它在'src/groovy'我假定沒有交易涉及,但是是的改善是有幫助的。 – dmahapatro

相關問題