2013-06-25 30 views
5

Tôi đang cố gắng truy cập vào một lớp mô phỏng (thông qua Nsubstitute) đã được tiêm vào hàm tạo.Tự động kết hợp + NSubstitute: Đóng băng mô hình?

Tôi đã sử dụng đoạn mã sau

var fixture = new Fixture() 
    .Customize(new AutoNSubstituteCustomization()); 

var sut = fixture.Create<MyService>(); 

Các sut được tạo thành công, và một phiên bản chế giễu của một giao diện được gọi là "IFileUtils" được tiêm vào constructor của "MyService".

nhưng tôi cần truy cập vào nó, vì vậy sau khi đọc tôi tin rằng tôi cần phải cố định các đối tượng vì vậy tôi có quyền truy cập vào nó như vậy

var fileUtilMock= fixture.Freeze<Mock<IFileUtils>>(); 

Nhưng mã này tôi tin là một cú pháp Moq là "Mock" không thể tìm thấy.

Thông thường để tạo ra một Nsubstitute của một lớp bạn làm như sau

var fileUtilMock= Substitute.For<IFileUtils>(); 

nhưng tất nhiên đây không phải là đông lạnh nên nó không được sử dụng và tiêm vào các nhà xây dựng.

có ai giúp được không?

Trả lời

10

Dựa trên kết luận từ this Mocking tools comparison article by Richard Banks, và làm thế nào AutoMoq làm việc, tôi tin rằng:

  • NSubstitute không có một sự tách biệt giữa MockMock.Object như Moq làm
  • Một AutoFixture.Auto * mở rộng móc trong một số SpecimenBuilderNode để cung cấp việc thực hiện các giao diện [được chế nhạo], tức làfixture.Create<IFileUtils>() nên làm việc
  • Freeze là tương đương với một var result = fixture.Create<IFileUtils>(); fixture.Inject(result)

Vì vậy, bạn chỉ có thể nói:

var fileUtilMock = fixture.Freeze<IFileUtils>(); 
+0

@daniel hilgarth là bất kỳ suy luận nào của tôi: D Hãy thoải mái chỉnh sửa bao nhiêu tùy thích và/hoặc yêu cầu tôi xóa bài đăng! –

6

Bạn phải Freeze trường hợp tự động được tạo trước khi tạo phiên bản MyService.

Cập nhật:

Như Ruben Bartelink chỉ ra, với NSubstitute tất cả các bạn phải làm là:

var fixture = new Fixture() 
    .Customize(new AutoNSubstituteCustomization()); 

var substitute = fixture.Freeze<IFileUtils>(); 

..và sau đó sử dụng phương pháp khuyến nông NSubstitute của.

Bằng cách đó, cùng một ví dụ, được cố định, sẽ được cung cấp cho nhà xây dựng MyService.

Ví dụ:

Đối với một giao diện IInterface:

public interface IInterface 
{ 
    object MakeIt(object obj); 
} 

Tất cả bạn phải làm với là:

var substitute = fixture.Freeze<IInterface>(); 
substitute.MakeIt(dummy).Returns(null); 

Returns thực sự là một phương pháp khuyến nông trong NSubstitute.

+0

Nhưng điều này tôi tin là dành cho Moq, Tôi đang sử dụng NSubstitute, và Mock - Mock không được tìm thấy hoặc tồn tại .. – Martin

+0

Bạn là chính xác. Tôi vừa cập nhật câu trả lời. –

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