2012-10-29 18 views
5

Tôi thực sự đánh giá cao sức mạnh của AutoFixture kết hợp với các lý thuyết của XUnit. Gần đây tôi đã thông qua việc sử dụng encapsulating customizations và cung cấp cho họ các bài kiểm tra của tôi thông qua một thuộc tính.Làm thế nào tôi có thể sửa đổi các vật cố định thuộc tính dữ liệu lý thuyết tùy chỉnh của tôi tạo ra cho AutoFixture?

Trong những trường hợp nhất định, tôi cần một kịch bản một lần để chạy thử nghiệm của mình. Khi tôi sử dụng một AutoDomainDataAttribute, như trên, tôi có thể yêu cầu một IFixture và mong đợi để có được cùng một trường hợp được tạo ra bởi các thuộc tính?

Trong trường hợp của mình, tôi đang sử dụng MultipleCustomization theo mặc định cho các bộ sưu tập, vv Tuy nhiên, trong trường hợp này, tôi chỉ muốn một mục duy nhất được gửi tới hàm tạo SUT của tôi. Vì vậy, tôi đã xác định phương pháp thử nghiệm của mình như vậy:

[Theory, AutoDomainData] 
public void SomeTest(IFixture fixture) { 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    ... 
} 

Thật không may, tôi nhận được ngoại lệ khi tạo Sản phẩm ẩn danh. Các thử nghiệm khác hoạt động tốt, nếu tôi yêu cầu một Sản phẩm làm tham số phương thức với các thuộc tính đó. Nó chỉ là một vấn đề trong trường hợp cụ thể này, nơi mà tôi hy vọng rằng tham số fixture là một thông số được tạo bởi AutoDomainDataAttribute của tôi.

Nhà xây dựng của sản phẩm mong đợi một IEnumerable thường được điền với 3 mục, do các tùy chỉnh tôi có tại chỗ thông qua AutoDomainData. Hiện tại, DomainCustomization của tôi là một CompositeCustomization được tạo thành từ MultipleCustomization và AutMoqCustomization, theo thứ tự đó.

Ngoại lệ là: "InvalidCastException: Không thể truyền đối tượng thuộc loại 'Castle.Proxies.ObjectProxy' để nhập 'Sản phẩm'."

Trả lời

7

Nếu bạn cần dụ Lịch thi đấu giống như một hoạt động trong các thuộc tính, bạn có thể tiêm Lịch thi đấu thành chính nó trong một Customization, như thế này:

public class InjectFixtureIntoItself : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Inject(fixture); 
    } 
} 

Chỉ cần nhớ để thêm video này CompositeCustomization bạn trước AutoMoqCustomization, vì IFixture là một giao diện và nếu AutoMoqCustomization xuất hiện trước, bạn sẽ nhận được một Mock instance thay thế - AFAICT, đó là những gì đang xảy ra với proxy Castle động.


Tuy nhiên, nếu bạn thực sự cần một trường hợp thi đấu, tại sao không chỉ viết một bình thường, phương pháp thử nghiệm bắt buộc:

[Fact] 
public void SomeTest() 
{ 
    var fixture = new Fixture().Customize(new DomainCustomization()); 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    // ... 
} 

Đó dường như với tôi để được dễ dàng hơn nhiều ... Tôi thỉnh thoảng tự làm như vậy ...


Tuy nhiên, tôi tự hỏi nếu bạn không thể cụm từ API hoặc trường hợp thử nghiệm theo cách khác để làm cho toàn bộ vấn đề biến mất. Tôi rất hiếm khi thấy rằng tôi phải thao túng tài sản RepeatCount những ngày này, vì vậy tôi tự hỏi tại sao bạn muốn làm điều đó?

Đó có lẽ là chủ đề của câu hỏi ngăn xếp ngăn xếp riêng biệt, mặc dù ...

+0

Cảm ơn bạn, Mark. Tôi ngay lập tức chuyển sang phương pháp kiểm tra bắt buộc sau khi đăng bài ở đây. Nó là tốt đẹp để biết thay thế mặc dù. Cuối cùng, thử nghiệm cụ thể của tôi là đảm bảo rằng loại cuối cùng không thể bị xóa khỏi sản phẩm (phải có ít nhất một sản phẩm). Đây là lần duy nhất tôi cần kiểm soát 'RepeatCount'. Cảm ơn một lần nữa! – ventaur

+0

Bạn không thể loại bỏ 'Danh mục.Đếm() - 1' mục trước tiên như là một phần của thiết lập thử nghiệm của bạn và sau đó thử nghiệm với chỉ một mục còn lại, bạn không thể xóa mục cuối cùng? –

+0

Vâng, tôi cho là vậy. Đôi khi, các lập trình viên của chúng tôi phải chịu đựng những điều phức tạp. :-) – ventaur

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