2014-10-01 20 views
16

Tôi có lớp sau đây:tùy chỉnh Autofixture: cung cấp tham số constructor

class Foo 
{ 
    public Foo(string str, int i, bool b, DateTime d, string str2) 
    { 
     ..... 
    } 
} 

Tôi đang tạo Foo với AutoFixture:

var foo = fixture.Create<Foo>(); 

nhưng tôi muốn AutoFixture để cung cấp một giá trị đã biết cho str2 tham số và sử dụng hành vi mặc định cho mọi thông số khác.

Tôi đã thử triển khai SpecimenBuilder nhưng tôi không thể tìm cách nhận siêu dữ liệu được liên kết với yêu cầu để biết rằng tôi đang được gọi từ hàm tạo Foo.

Có cách nào để đạt được điều này không?

+3

Dưới đây là một lựa chọn: http://stackoverflow.com/a/16954699/126014 –

+3

Vì lợi ích đầy đủ, tôi cũng muốn chỉ ra điều này: http://stackoverflow.com/a/18238876/126014 –

+3

Có lẽ bạn cũng sẽ thấy điều này hữu ích: http://stackoverflow.com/a/15561752/ 126014 –

Trả lời

4

Như đã trả lời here bạn có thể có một cái gì đó giống như

public class FooArg : ISpecimenBuilder 
{ 
    private readonly string value; 

    public FooArg(string value) 
    { 
     this.value = value; 
    } 

    public object Create(object request, ISpecimenContext context) 
    { 
     var pi = request as ParameterInfo; 
     if (pi == null) 
      return new NoSpecimen(request); 

     if (pi.Member.DeclaringType != typeof(Foo) || 
      pi.ParameterType != typeof(string) || 
      pi.Name != "str2") 
      return new NoSpecimen(request); 

     return value; 
    } 
} 

và sau đó bạn có thể đăng ký nó như thế này

var fixture = new Fixture(); 
fixture.Customizations.Add(new FooArg(knownValue)); 

var sut = fixture.Create<Foo>(); 
Các vấn đề liên quan