Sự khác biệt giữa phương thức xây dựng và tạo trong FactoryGirl là gì?


95

Phần giới thiệu Factory Girl mô tả sự khác biệt giữa FactoryGirl.build()FactoryGirl.create():

# Returns a User instance that's not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

Tôi vẫn không hiểu sự khác biệt thực tế giữa hai. Ai đó có thể đưa ra một ví dụ mà bạn muốn sử dụng cái này chứ không phải cái kia không? Cảm ơn!

Câu trả lời:


117

Các create()phương pháp vẫn còn trường hợp của mô hình trong khi build()phương pháp giữ nó chỉ vào bộ nhớ.

Cá nhân tôi chỉ sử dụng create()phương pháp này khi sự kiên trì thực sự cần thiết vì việc viết lên DB khiến việc thử nghiệm trở nên tốn thời gian.

ví dụ

Tôi tạo người dùng để xác thực create()bởi vì công cụ xác thực của tôi truy vấn DB.

Để kiểm tra xem một mô hình có thuộc tính hay không, build()phương pháp sẽ thực hiện vì không yêu cầu quyền truy cập DB.

it{Factory.build(:user).should respond_to(:name)}

Cập nhật

"Có một ngoại lệ mà việc xây dựng thực sự 'tạo ra' khi bạn đang xây dựng các liên kết, tức là liên kết của bạn không còn trong bộ nhớ nhưng vẫn tồn tại. Hãy ghi nhớ điều đó" - Shakes


16
Có một ngoại lệ mà việc xây dựng thực sự 'tạo ra' khi bạn đang xây dựng các liên kết, tức là liên kết của bạn không còn trong bộ nhớ nhưng vẫn tồn tại. Hãy ghi nhớ điều đó
Shakes vào

@Shakes, tôi không làm việc trong đường ray nữa. Tôi sẽ kiểm tra điều đó ngay khi tôi có thể.
Helio Santos

Có ai đã tạo một công cụ để thay thế từng trường hợp của createbằng buildvà hoàn tác nó nếu thử nghiệm không thành công?
mgold

#createđọc và trả lại đối tượng được lưu từ đĩa hay nó trả lại đối tượng trong bộ nhớ sau khi duy trì nó? Nói cách khác, là làm create(...)tương đương với create(...).reload?
Dennis

@mgold Vim khá giỏi trong việc đó.
Sự Chuộc Tội Có Giới Hạn

15

Sử dụng FactoryGirl.build(:factory_name)không liên tục đến db và không gọisave! , vì vậy xác thực Bản ghi Hoạt động của bạn sẽ không chạy. Điều này nhanh hơn nhiều, nhưng xác nhận có thể quan trọng.

Việc sử dụng FactoryGirl.create(:factory_name)sẽ tiếp tục đối với db và sẽ gọi xác thực Bản ghi Hoạt động. Điều này rõ ràng là chậm hơn nhưng có thể bắt lỗi xác thực (nếu bạn quan tâm đến chúng trong các thử nghiệm của mình).


11
Hoặc, bạn chỉ có thể làm FactoryGirl.build (: factory_name) .valid? chạy xác thực mà không cần lưu vào cơ sở dữ liệu.
jinavar1

1

FactoryGirl.create()sẽ tạo đối tượng và liên kết mới (nếu nhà máy có) cho nó. Tất cả chúng sẽ được lưu giữ trong một cơ sở dữ liệu. Ngoài ra, nó sẽ kích hoạt cả xác nhận mô hình và cơ sở dữ liệu. Các cuộc gọi lại after(:build)after(:create)sẽ được gọi sau khi nhà máy được lưu. Cũng before(:create)sẽ được gọi trước khi nhà máy được lưu.

FactoryGirl.build()sẽ không lưu một đối tượng, nhưng sẽ vẫn đưa ra yêu cầu đối với cơ sở dữ liệu nếu nhà máy có các liên kết. Nó sẽ kích hoạt xác nhận chỉ cho các đối tượng liên quan. Gọi lạiafter(:build) sẽ được gọi sau khi nhà máy được xây dựng.

Lưu ý rằng trong hầu hết các trường hợp khi thử nghiệm các mô hình tốt nhất nên sử dụng build_stubbedđể có hiệu suất tốt hơn. Đọc thêm về nó ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.