我想建立一对一的关系并进行测试。所以我创建了两个类。

下面有两个类。


class Book {

  String title
  Date releaseDate
  String ISBN

  static belongsTo = [person:Person]
}

class Person {

  Book book;

  String name
  Integer age
  Date lastVisit

  static constraints = {
    book unique: true  // "one-to-one". Without that = "Many-to-one".
  }

}


并编写测试:
public void testOneToOne() { Person person1 = new Person(name:"person_b1", age: 99, lastVisit: new Date()) Person person2 = new Person(name:"person_b2", age: 100, lastVisit: new Date()) Book oneBook = new Book(title:"somebook", ISBN: "somebook1", releaseDate: new Date()) person1.setBook(oneBook) person1.save() person2.setBook(oneBook) person2.save() // ! c'est impossible pour 'one-to-one'}
因此,如果这是一对一的,那么我将无法将person2保存到数据库,因为一本书无法链接到更多人。那么我应该在person2.save()发生异常的同时呢?

我没有而且person2不会保存到db。那么我该如何测试-如何使测试失败?

最佳答案

unique约束用于确保一个类的一个实例只能与另一个类的单个实例连接:
http://grails.org/doc/latest/ref/Constraints/unique.html

在您的示例中,您将Book的一个实例连接到Person的两个实例,即一对多关联-因此保存应该失败。如果检查person2.errors.allErrors属性,则应该看到Person.book.unique约束已被违反。

这就是一对一关联测试的样子-person2需要一本自己的书,因为您已经声明一本书只能属于unique约束的一个人。

   public void testOneToOne() {
        Person person1 = new Person(name:"person_b1", age: 99, lastVisit: new Date())
        Person person2 = new Person(name:"person_b2", age: 100, lastVisit: new Date())

        Book oneBook = new Book(title:"somebook", ISBN: "somebook1", releaseDate: new Date())
        Book twoBook = new Book(title:"anotherbook", ISBN: "somebook2", releaseDate: new Date())

        person1.setBook(oneBook)
        assertNotNull(person1.save())

        person2.setBook(twoBook)
        assertNotNull(person2.save())
  }

看起来您实际上想要一个(书)对许多(人)的关联,因此只需忽略unique约束即可。

10-06 04:24