2010-06-04 5 views
21

tôi có một tập hợp các Constructors:Sử dụng Moq để giả lập Constructor?

public BusinessObjectContext() 
     : this(CloudStorageAccount.FromConfigurationSetting("DataConnectionString").TableEndpoint.ToString(), 
       CloudStorageAccount.FromConfigurationSetting("DataConnectionString").Credentials) {} 

public BusinessObjectContext(string dataConnectionString) 
     : this(CloudStorageAccount.Parse(dataConnectionString).TableEndpoint.ToString(), 
       CloudStorageAccount.Parse(dataConnectionString).Credentials) { } 

public BusinessObjectContext(String baseAddress, StorageCredentials credentials) 
     : base(baseAddress, credentials) { } 

Tuy nhiên khi thử nghiệm/Mocking tôi cần những đối tượng mà không cần bất kỳ tham số chuỗi kết nối. Làm thế nào tôi có thể làm điều này - tốt nhất trong Moq?

Điều này có thể thực hiện được không?

Trả lời

17

Có vẻ như bạn có mùi mã - số constructor is doing too much work. Bài viết bao gồm một bộ các bản sửa lỗi cho các tình huống như vậy. Về cơ bản, câu trả lời là chỉ chỉ thực hiện nhiệm vụ trong các nhà xây dựng, không thực thi logic nghiệp vụ.

+0

Hrrm. Tôi thấy lập luận trong khái niệm này. Mặt khác, tôi muốn bảo vệ người dùng của đối tượng GenericBusinessObject khỏi suy nghĩ về bối cảnh nguồn dữ liệu. Nếu tôi làm theo các đối số của bạn, thì người dùng của GenericBusinessObject phải suy nghĩ về nó. Đây là ít abtraction. Có thể không có cách nào khác, nhưng điều gì đó khiến tôi ngần ngại. –

+1

Làm cho một nhà máy hoặc sử dụng một Conatainer IOC để loại bỏ nhu cầu này cho người dùng phải lo lắng về bối cảnh dữ liệu. – Finglas

26
var myMockBOC = new Mock<BusinessObjectContext>(null, null); 

Điều này sẽ vượt qua giá trị rỗng cho hai tham số của bạn.

Một cách tiếp cận khác là tạo một hàm tạo bên trong có nghĩa là chỉ sử dụng thử nghiệm và sử dụng InternalsVisibleTo để cho phép hội đồng kiểm tra của bạn sử dụng nó. Thật không may, điều này có một nhược điểm lớn trong đó nếu bạn ký hợp đồng của bạn, Moq is unable to use the constructor. Đây là nghĩa vụ phải được giải quyết trong phiên bản 4.0 của Moq mặc dù.

+6

Hạn chế đối với một hàm tạo nội bộ là bây giờ bạn đang viết mã để hỗ trợ các bài kiểm tra đơn vị của mình. –

+2

Tôi cho rằng điều đó có thể chấp nhận được khi có yêu cầu có mục đích rằng API * public * không được tiêm. Thời gian duy nhất nó sẽ trình bày các vấn đề sẽ là nếu các nhà thầu của bạn không đơn giản, và có logic kinh doanh - khi đó, khi nói đi, bạn sẽ có hai vấn đề ... – womp

+0

Giải pháp rất đơn giản! Giúp tôi rất nhiều! –