2013-02-20 30 views
7

Mã:AutoFixture không CreateAnonymous MVC Controller

IFixture fixture = new Fixture().Customize(new AutoMoqCustomization()); 
fixture.Customize<ViewDataDictionary>(c => c.Without(x => x.ModelMetadata)); 
var target = fixture.CreateAnonymous<MyController>(); 

các Ngoại lệ:

System.Reflection.TargetInvocationException: System.Reflection.TargetInvocationException: ngoại lệ đã được ném bởi mục tiêu của một lời kêu gọi. ---> System.NotImplementedException: Phương thức hoặc thao tác không được triển khai.

MyController() có 3 tham số.

Tôi đã thử bản sửa lỗi được mô tả trong câu trả lời here nhưng nó sẽ không hoạt động.

+2

Phiên bản nào của ASP.NET MVC bạn đang sử dụng? Phương thức khởi tạo 'MyController' trông như thế nào? 'MyController' có bất kỳ thuộc tính ghi nào không? Ngoại lệ có cung cấp thêm chi tiết (ví dụ: theo dõi ngăn xếp) không? –

Trả lời

21

As it seems, khi sử dụng MVC 4, bạn phải tùy chỉnh cá thể Fixture theo cách khác.

Xét nghiệm này phải vượt qua nếu bạn thay:

fixture.Customize<ViewDataDictionary>(c => c 
    .Without(x => x.ModelMetadata)); 

với:

fixture.Customize<ControllerContext>(c => c 
    .Without(x => x.DisplayMode)); 

Tùy chọn, bạn có thể tạo một composite của các tùy chỉnh cần thiết:

internal class WebModelCustomization : CompositeCustomization 
{ 
    internal WebModelCustomization() 
     : base(
      new MvcCustomization(), 
      new AutoMoqCustomization()) 
    { 
    } 

    private class MvcCustomization : ICustomization 
    { 
     public void Customize(IFixture fixture) 
     { 
      fixture.Customize<ControllerContext>(c => c 
       .Without(x => x.DisplayMode)); 
     } 
    } 
} 

Sau đó, các thử nghiệm ban đầu có thể được viết lại như sau:

[Fact] 
public void Test() 
{ 
    var fixture = new Fixture() 
     .Customize(new WebModelCustomization()); 

    var sut = fixture.CreateAnonymous<MyController>(); 

    Assert.IsAssignableFrom<IController>(sut); 
} 
+0

thiên tài! cảm ơn. – Tsar

+0

Lưu ý cho người khác: Tôi phải thêm một tham chiếu đến 'System.Web.WebPages' để có được điều này để biên dịch –

+0

FYI điều này cũng được yêu cầu cho' MVC 5.1.2'. – MEMark

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