2012-07-17 18 views
5

Tôi đang cố gắng sử dụng findOrCreateBy để tìm kiếm một đối tượng hoặc khởi tạo một đối tượng nếu tôi không thể tìm thấy đối tượng phù hợp, nhưng nó không hoạt động như tôi mong đợi.findOrCreateBy có hoạt động với các phiên bản miền khác không?

Đây là những gì tôi có:

String myBaz = "some unique string" 
FooType myFooType = FooType.findByName("Large") 

// The Foo table is empty, so this should give me a new Foo 
Foo myFoo = Foo.findOrCreateByBazAndFooType(myBaz, myFooType) 

assert myFoo.baz == myBaz 
assert myFoo.fooType == myFooType // Fails because myFoo.fooType is null, 
// but should be set to myFooType 

Tôi đang làm gì sai? Tại sao fooType không được đặt đúng cách? Đây có phải là hành vi mong đợi hay đây là lỗi trong Grails?

+0

Vâng, nó có thể là ngớ ngẩn nhưng vì cơ sở dữ liệu của bạn là trống rỗng, FooType.findByName ("lớn") sẽ trả về null, phải không? Và sau đó bạn tạo một đối tượng truyền thuộc tính null này. Vì vậy, yeah, myFoo.fooType phải thực sự là null trong trường hợp này. –

+0

@TiagoFarias, tôi đã cập nhật câu hỏi chính xác hơn vào thời điểm này. Các FooTypes được bootstrapped vào DB, do đó, nó không thực sự trống rỗng, nhưng không có đối tượng Foo trong DB. Khi 'findOrCreate *' được gọi, 'myFooType' là một cá thể tồn tại của' FooType'. – cdeszaq

Trả lời

1

Tôi không chắc nhưng có vẻ như bạn đang cố thực hiện điều này như một bài kiểm tra. (dựa trên khẳng định của bạn)

Phương pháp động được thêm bởi khung Grails không có sẵn trong các bài kiểm tra đơn vị trừ khi bạn giả lập lớp miền. Bây giờ đây là grails cũ mã lấy từ Question site khác nhưng nó có thể giúp

import grails.test.GrailsUnitTestCase 

class MessageControllerTests extends GrailsUnitTestCase { 

    def savedMessages 

    void setUp() { 
     super.setUp() 
     savedMessages = [] 
     mockDomain(Message, savedMessages) //mocking the domain class 
     mockController(MessageController) //mocking the controller 
    } 

    void testMessageCanBeCreated() { 
     def messageController = new MessageController() 
     messageController.params.title = 'detail' 
     messageController.params.detail = 'some detail' 

     messageController.save() // executing the save action on the MessageController 

     assertEquals('list', messageController.redirectArgs.action) 
     assertEquals(1, savedMessages.size()) //assert the message has been saved 
    } 
} 
+0

Các xác nhận chỉ có trong đó để hiển thị vấn đề. Đây thực sự là mã từ một dịch vụ, vì vậy tất cả các bit GORM và bobs đều có, nhưng 'findOrCreateBy *' chỉ hoạt động không chính xác. Cảm ơn mặc dù. – cdeszaq

Các vấn đề liên quan