在Grails 2.2中可以对mongodb动态属性进行单元测试吗?

Kry*_*ian 5 grails unit-testing grails-orm mongodb

在单元测试部分,mongodb-1.1.0GA的文档似乎已经过时了:http://springsource.github.com/grails-data-mapping/mongo/manual/ref/Testing/DatastoreUnitTestMixin.html

以下代码

@TestFor(Employee)
class EmployeeTests extends GroovyTestCase {

    void setUp() {
    }

    void tearDown() {
    }

    void testSomething() {
        mockDomain(Employee)

        def s = new Employee(firstName: "first name", lastName: "last Name", occupation: "whatever")
        s['testField'] = "testValue"
        s.save()

        assert s.id != null

        s = Employee.get(s.id)

        assert s != null
        assert s.firstName == "first name"
        assert s['testField'] == "testValue"

    }
}
Run Code Online (Sandbox Code Playgroud)

失败并出现此错误:

No such property: testField for class: Employee
Run Code Online (Sandbox Code Playgroud)

员工类非常简单:

class Employee {

    String firstName
    String lastName
    String occupation


    static constraints = {
        firstName blank: false, nullable: false
        lastName blank: false, nullable: false
        occupation blank: false, nullable: false
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,动态属性的单元测试是否可行?如果是的话,怎么样?

Rob*_*her 4

对于动态属性没有开箱即用的支持,但添加起来相当容易。我已将以下代码放入我的设置方法中。它将向您使用@TestFor或启用的任何域类添加动态属性@Mock

grailsApplication.domainClasses.each { domainClass ->
    domainClass.metaClass.with {
        dynamicAttributes = [:]
        propertyMissing = { String name ->
            delegate.dynamicAttributes[name]
        }
        propertyMissing = { String name, value ->
            delegate.dynamicAttributes[name] = value
        }
    }
}
Run Code Online (Sandbox Code Playgroud)