2012-03-13 15 views
7

Tôi đang cố gắng thực hiện một số việc mô phỏng đơn giản một lớp Domain trong một bài kiểm tra đơn vị cho một dịch vụ Grails theo tài liệu, nhưng nó dường như không hoạt động, trong các truy vấn đó trả về null. Tôi thiếu một cái gì đó đơn giản? Dưới đây là phần có liên quan của mã của tôi, tôi thay đổi tên lớp và phương pháp kiểm tra cho rõ ràng:MockDomain gọi cung cấp dữ liệu miền lịch thi đấu không hoạt động, tôi đang thiếu gì? Grails 2.0.1

@TestFor(MyService) 
@TestMixin(DomainClassUnitTestMixin) 

class MyServiceTests { 


    void testMyThing() { 
     defineBeans {anotherService(AnotherService)} //My service under test uses another service, unlikely relevant? 

     MyUser.metaClass.isDirty = { //workaround for mockDomain not adding isDirty method. 
      println("dirty check called"); 
     } 

     mockDomain(MyUser, [ 
       [username: "[email protected]", accountType: UserType.STANDARD, id: 1L], 
       [username: "[email protected]", accountType: UserType.STANDARD, id:3L], 
       [username: "[email protected]", accountType: UserType.BUSINESS, id:2L] 
     ]) 

     MyUser user1 = MyUser.get(1); 
     System.out.println("user 1: ${user1}"); // output is 'user 1: null' 

     MyUser user1byName = MyUser.findByUsername("[email protected]"); 
     System.out.println("user 1 by name: ${user1byName}"); // output is 'user 1 by name: null' 

     ... the actual testing stuff which would love to have non null MyUser objects ... 
}   
} 
+0

Bạn đã thử thêm @Mock (MyUser) chưa? –

+0

@tomas Có, tôi đã làm, không có hiệu lực. Với các tài liệu, nó không cần thiết khi sử dụng mockDomain() – Peter

Trả lời

11

I figured it out, và bạn nghĩ rằng tôi đã có thể nghĩ về trao này tôi trước đây đã cắn nó. Vấn đề là với xác nhận, và hành vi GORM mặc định của Grails âm thầm không lưu dữ liệu trên save() (mockDomain phải sử dụng khi bạn truyền dữ liệu cho các cá thể mô phỏng của bạn) nếu lớp Domain có lỗi xác thực. MyUser yêu cầu mật khẩu không trống.

Từ lâu lắm rồi tôi đã thêm grails.gorm.failOnError=true để Config.groovy tôi cho ứng dụng của tôi vì vậy tôi không bao giờ nghĩ về điều đó nữa, nhưng tất nhiên điều đó không có được đọc trong cho đơn vị kiểm tra

Theo tôi điều này làm cho rằng chữ ký của mockDomain rất mong manh (và tôi không thể tìm thấy cách thiết lập failOnError = true). Tôi đã chuyển đổi thiết lập dữ liệu giả thành sau, có kết quả chính xác tương tự, nhưng cho phép thất bại ngay lập tức nếu bạn thiết lập dữ liệu không chính xác.

@Mock(MyUser) 
class MyServiceTests { 
    ... 

    void testMyThing() { 
     new MyUser(username: "[email protected]", 
        accountType: UserType.STANDARD, 
        id: 1L).save(failOnError:true) //throws exception because MyUser requires password field to be non blank 
    ... 
    } 
} 
+1

Tôi chỉ mất một giờ khó hiểu với cùng một vấn đề chính xác, cho đến khi tôi tìm thấy điều này. Cảm ơn, người đàn ông! – elias

+1

Tôi đang sử dụng plugin "build-test-data", và plugin đó đã hoạt động ... nhưng MyUser mới (...) thì không. Vì vậy, vấn đề là loại ngụy trang. Rất khó khăn, và câu trả lời này đã giúp –

+0

Câu trả lời này đã cứu tôi đập đầu tôi vào tường trong một giờ nữa! Tìm tốt, và tôi chắc chắn rằng tất cả chúng ta sẽ bị cắn một lần nữa. – spikeheap

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