2014-04-10 14 views
5

Tôi mới bắt đầu sử dụng AutoFixture, và tôi nhận được những điều cơ bản (từ những gì tôi có thể thấy có nhiều hơn nữa), nhưng tôi đang gặp vấn đề và tôi không phải là 100 % chắc chắn những gì thực hành tốt nhất là cho các công cụ như thế này.Populating một bộ sưu tập Tài sản của một vật cố định với autofixture

Tôi đang thử nghiệm một bộ điều khiển và một phần của quy trình là hành động có thể trả về một trong hai chế độ xem.

  • Nếu danh mục có trẻ em - hiển thị các loại danh sách xem
  • Nếu một danh mục không có con hiển thị các sản phẩm xem

Vì vậy, tôi đang nghĩ đến việc một vài thử nghiệm về hành vi niêm yết, nhưng dữ liệu lịch thi đấu được trả về sẽ khác. Người ta sẽ trả về một con số là 0, số còn lại là số lớn hơn số không, vì vậy tôi muốn cố định giúp tôi với điều đó.

Tôi đã tìm kiếm xung quanh và có thể tôi phải tạo tùy chỉnh một số loại, nhưng hy vọng API cơ bản có thể giúp tôi ở đây. Tôi cố gắng này:

var category = _fixture.Build<Category>() 
    .Do(x => x.SubCategories = _fixture.CreateMany<Category>(3).ToList()) 
    .Create(); 

_fakeCategoryService 
    .Setup(x => x.GetById(id)) 
    .Returns(category); 

này biên dịch và chạy thử nghiệm (và thất bại), nhưng các loại phụ luôn có tổng số là 0, do đó, tôi đang nghĩ đến cuộc gọi của tôi để tạo Rất nhiều việc phải làm là hoàn toàn sai (nó kinda có vẻ sai nhưng tôi vẫn không chắc chắn những gì nó nên được thay thế bằng).

CẬP NHẬT: nên đọc bảng gian lận tốt hơn một chút!

var category = _fixture.Build<Category>() 
    .With(x => x.SubCategories, _fixture.CreateMany<Category>(3).ToList()) 
    .Create(); 

Tác phẩm này, nếu có cách nào tốt hơn, vui lòng cho tôi biết.

Trả lời

5

Có, Build là chính xác.


Nếu bạn muốn tùy chỉnh các thuật toán tạo cho một đơnCategory sử dụng Build:

var actual = fixture 
    .Build<Category>() 
    .With(x => x.SubCategories, 
     fixture.CreateMany<Category>().ToList()) 
    .Create(); 

Assert.NotEmpty(actual.SubCategories); 

Nếu bạn muốn tùy chỉnh các thuật toán tạo cho tất cảCategory trường hợp sử dụng Customize:

fixture.Customize<Category>(c => c 
    .With(x => x.SubCategories, 
     fixture.CreateMany<Category>().ToList())); 

var actual = fixture.Create<Category>(); 

Assert.NotEmpty(actual.SubCategories); 
+0

Cảm ơn thông tin bổ sung, Nhiều đánh giá cao! – Modika

5

là hy vọng API cơ bản có thể giúp tôi đây

Nó giúp bạn, nếu bạn biết làm thế nào để lắng nghe :) AutoFixture ban đầu được xây dựng như một công cụ để phát triển Test-Driven (TDD) và TDD là tất cả về phản hồi. Theo tinh thần của GOOS, bạn nên nghe thử nghiệm của mình. Trong trường hợp này, nó giống như số Framework Design Guidelines:

DO NOT provide settable collection properties.

Thay vì chỉ định một danh sách bán buôn đến một bất động sản, xem xét

  • làm cho sở hữu bộ sưu tập read-only, và để cho các khách hàng gọi Add vv
  • lấy bộ sưu tập như một tham số nhà xây dựng thay vì tài sản biến đổi

Trong trường hợp thứ hai, AutoFixture sẽ tự động cung cấp bộ sưu tập dân cư khi nó gọi hàm tạo, mặc dù trong p này trường hợp khớp, vì bạn có biểu đồ đệ quy tiềm ẩn, bạn có thể cần phải explicitly handle it.

Trong trường hợp đầu tiên, AutoFixture không làm bất cứ điều gì ra khỏi hộp, nhưng có một phương pháp AddManyTo mở rộng, cho phép bạn điền vào một bộ sưu tập trong một tuyên bố duy nhất:

fixture.AddManyTo(category.SubCategories); 
+0

Tôi có nghĩa là nó như tôi đã nhận được nó sai không phải là API đã sai :) Cảm ơn bạn đã thêm thông tin, tôi sẽ xem xét nó. Tôi nghĩ rằng tôi đã thấy một ví dụ về chức năng AddManyTo trên blog của bạn! – Modika

+0

Hi Mark, ứng dụng này không phải là lớn nhất nên lớp Category là class được sử dụng cho EF nên tôi không tin (sẽ phải kiểm tra lại) rằng bạn có thể làm việc mà không cần nó là một tài sản có thể cài đặt. Đối với một đối tượng miền thuần túy, tôi có được bạn. – Modika

+0

Đã lâu rồi tôi mới sử dụng EF, nhưng tôi tin rằng bạn đã đúng:/ –

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