2013-06-24 18 views
8

Tôi đang cố gắng tạo tùy chỉnh cho phép tôi chỉ định rằng các thuộc tính của các loại không nằm trong một không gian tên nhất định sẽ không được điền.Cách tạo tùy chỉnh bỏ qua thuộc tính tự động cho toàn bộ phạm vi các loại?

Về cơ bản, tôi đang cố gắng để thay đổi điều này:

fixture.Customize<Window>(c => c.OmitAutoProperties()); 
fixture.Customize<ContentControl>(c => c.OmitAutoProperties()); 
fixture.Customize<TextBlock>(c => c.OmitAutoProperties()); 
// Many many more... 

này:

fixture.Customize(t => !t.Namespace.StartsWith("MyProject"), 
        c => c.OmitAutoProperties()); 

Làm thế nào để đạt được điều này?

Tôi thực sự chỉ quan tâm đến kết quả, không phải cho API hư cấu được hiển thị ở đây, vì vậy việc triển khai ISpecimenBuilder hoặc ICustomization của riêng tôi không phải là vấn đề.

Trả lời

3

Cách đơn giản nhất để làm điều này có lẽ là thông qua một tùy chỉnh mẫu builder:

public class OmitPropertyForTypeInNamespace : ISpecimenBuilder 
{ 
    private readonly string ns; 

    public OmitPropertyForTypeInNamespace(string ns) 
    { 
     this.ns = ns; 
    } 

    public object Create(object request, ISpecimenContext context) 
    { 
     if (IsProperty(request) && 
      IsDeclaringTypeInNamespace((PropertyInfo)request)) 
     { 
      return new OmitSpecimen(); 
     } 

     return new NoSpecimen(request); 
    } 

    private bool IsProperty(object request) 
    { 
     return request is PropertyInfo; 
    } 

    private bool IsDeclaringTypeInNamespace(PropertyInfo property) 
    { 
     var declaringType = property.DeclaringType; 
     return declaringType.Namespace.Equals(
      this.ns, 
      StringComparison.OrdinalIgnoreCase); 
    } 
} 

Như thường lệ, đó là một quy ước tốt cũng để cung cấp một phù hợp với tùy:

public class OmitAutoPropertiesForTypesInNamespace : ICustomization 
{ 
    private readonly string ns; 

    public OmitAutoPropertiesForTypesInNamespace(string ns) 
    { 
     this.ns = ns; 
    } 

    public void Customize(IFixture fixture) 
    { 
     fixture.Customizations.Add(new OmitPropertyForTypeInNamespace(this.ns)); 
    } 
} 

Điều này cuối cùng sẽ cho phép bạn nói:

var fixture = new Fixture(); 
fixture.Customize(new OmitAutoPropertiesForTypesInNamespace("MyProject")); 
+0

Cảm ơn, điều đó hoạt động giống như một sự quyến rũ! –

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