2011-04-15 65 views
2

我有一個方法,在自定義標籤庫,像這樣:成株自定義標籤庫方法在控制器單元測試

def deleteAction = {attrs -> 
    def id = attrs['id'] 
    def type = attrs['type'] 
    def clazz = attrs['class'] 
    def html = new MarkupBuilder(out) 
    html.span(class: "${clazz} ui-icon ui-icon-trash {id:'${id}'}") 
} 

我有一個使用這個方法,我試圖存根出來的單元測試控制器,所以我有以下幾點:

def mockMyTagLib = mockFor(MyTagLib) 
    mockMyTagLib.demand.deleteAction(1) {id, type, clazz -> 
    def html = new MarkupBuilder(new StringWriter()) 
    html.span(class: "${clazz} ui-icon ui-icon-trash {id:'${id}'}") 
} 

controller.metaClass.mn = mockMyTagLib.createMock() 

但我不斷收到如下:

沒有更多的呼叫 'deleteAction'預計在這一點上是。要求完成 。

我在這裏做錯了什麼?下面是它在控制器實際使用:

"${mn.deleteAction(id: it.id, type: 'bookProduct', 'class': 'del-book-product')}" 

回答

2

以下是Testing - Reference Documentation

...然後,您指定要與 可選範圍爲嘲笑 方法的名稱它的論點。這 範圍決定了有多少次你 希望調用的方法,所以如果 調用數降至 之外的範圍(或太少 或太多)則斷言錯誤 將被拋出的。如果沒有指定範圍 ,則假設默認值「1..1」爲 ,即該方法必須是 恰好調用一次。

您已經指定了demand.deleteAction(1),這意味着該方法必須只調用一次。

另外,如果你願意,你可以隨時將您的模擬將它指定爲mockFor第二個參數(默認爲嚴格)

mockFor(class, loose = false) 
+0

Grails的告訴我,它無法找到的財產​​,以鬆當我定義mockFor(Class,loose = false)時,「寬鬆」。但是,我修改了我的需求,直到我使用範圍1..3工作。 (爲什麼需要它3次我仍然需要弄清楚)。所以我已經過去了,但得到了一個新的錯誤。我懷疑這與此無關,所以我相信你已經解決了我的問題。我會讓它工作100%,如果它確實不是一個相關的問題,你會得到賞金,我會將其標記爲答案。 – Gregg 2011-04-18 05:17:10

+0

祝你好運!我希望你能解決你的新問題。奇怪的是,鬆散不適合你。應該只是mockFor(MyClass,false)這裏的Javadocs:http://grails.org/doc/latest/api/grails/test/GrailsUnitTestCase.html – 2011-04-18 06:17:58

相關問題