2014-12-02 82 views
0

我有一組名爲Organization和OrganizationController的域和控制器類。Grails中的模擬域類

的OrganizationController只有一個方法:

def index() { 
    def organizations = Organization.list() 
    [orgs: organizations] 
} 

我試着通過2種方式來模擬出域類。

第一種方式是使用@Mock註釋,並創建對象和保存:

void "test index"() { 
    given: 
    new Organization(name: 'JIMJIM').save() 
    new Organization(name: 'ABC').save() 

    def expected = [org: [new Organization(name: 'JIMJIM'), 
        new Organization(name: 'ABC')]] 

    when: 
    def actual = controller.index() 

    then: 
    actual == expected 
} 

導致Oraganization.list返回一個空列表。實際收益[ORG:[]

我使用mockDomain也試過:

void "test index"() { 
    given: 
     mockDomain(Organization, [new Organization(name: 'JIMJIM'), 
           new Organization(name: 'ABC') 
    ]) 

    def expected = [org: [new Organization(name: 'JIMJIM'), 
        new Organization(name: 'ABC')]] 

    when: 
    def actual = controller.index() 

    then: 
    actual == expected 
} 

但是我仍然得到了同樣的結果。爲什麼我的域名不會被嘲笑?

我的測試裝飾(OrganizationControllerSpec)如下:

@TestFor(OrganizationController) 
@Mock(Organization) 
@TestMixin(DomainClassUnitTestMixin) 
class OrganizationControllerSpec extends Specification { 

我使用Grails 2.3.8。

回答

1

的第一個片段似乎是確定的,但...

首先,進行了Organization對象實際創建?是否提供了所有必填字段?請嘗試使用save(failOnError: true)來確保。

此外,在控制器中,您有orgs,而您在測試中使用org。這只是一個拼寫錯誤嗎?

此外,除非Organization類中有equals方法被覆蓋,否則來自數據庫的對象不等於您使用new運算符創建的對象。

+0

你說的對! – monksy 2014-12-02 08:37:31