2012-07-17 85 views
5

我试图用findOrCreateBy来搜索一个对象或者实例化一个对象,如果我找不到一个匹配的对象,但它不能像我期望的那样工作。findOrCreateBy是否可以与其他域实例一起使用?

这是我有:

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 

我在做什么错?为什么fooType未正确设置?这是预期的行为还是Grails中的一个错误?

+0

嗯,这可能是愚蠢的,但由于你的数据库是空的,FooType.findByName(“大”)将返回null,对不对?然后你创建一个传递这个空属性的对象。所以,是的,在这种情况下,myFoo.fooType必须为真。 – 2012-07-17 17:09:50

+0

@TiagoFarias,我更新了这个问题,在这一点上更正确。 FooType被引导到数据库中,所以它不是真的空,但是DB中没有Foo对象。当调用'findOrCreate *'时,'myFooType'是'FooType'的一个持久实例。 – cdeszaq 2012-07-17 17:15:25

回答

1

我不确定,但它看起来像你试图做这个测试。 (基于你的断言)

除非你模拟域类,否则在单元测试中不能使用由Grails框架添加的动态方法。现在,这是从另一个Question site采取旧Grails的代码,但它可以帮助

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

断言仅在那里显示问题。这实际上是来自服务的代码,所以所有的GORM位和bob都在那里,但'findOrCreateBy *'只是不能正常工作。不过谢谢。 – cdeszaq 2012-07-17 18:36:15

相关问题