2012-12-14 25 views
6

Xin lưu ý, tôi hơi mới với TDD, vì vậy tôi sẽ đưa ra lời khuyên chung cũng như câu trả lời cụ thể.AutoMoqCustomization có hoạt động cho các lớp trừu tượng không?

Cả lớp trừu tượng lẫn giao diện đều không thể được khởi tạo. Rõ ràng Moq có thể cho tôi một ví dụ giả lập về ADataFeed trong bài kiểm tra thứ hai. Tại sao AutoMoqCustomization làm việc cho các giao diện IDataFeed nhưng không cho các lớp trừu tượng ADataFeed, thay vì ném một InvalidOperationException?

Thứ hai, cách tiếp cận AutoFixture (hoặc TDD nói chung) là lái một thiết kế có thể gọi cho lớp trừu tượng với một hàm tạo để yêu cầu và đảm bảo các giá trị nhất định, chẳng hạn như chuỗi kết nối trong trường hợp này?

[Theory, AutoMoqData] 
public void AllDataFeedsHaveAConectionString(
    IDataFeed sut) 
{ 
    var result = sut.GetConnectionString(); 
    Assert.Null(result); 
} 

[Fact] 
public void AllDataFeedsRequireAConnectionString() 
{ 
    var expected = Guid.NewGuid().ToString(); 
    var sut = new Mock<ADataFeed>(expected); 
    var result = sut.Object.GetConnectionString(); 
    Assert.Equal(expected, result); 
} 

[Theory, AutoMoqData] 
public void AllDataFeedsRequireAConnectionString2(
    [Frozen] string expected, 
    ADataFeed sut) 
{ 
    var result = sut.GetConnectionString(); 
    Assert.Equal(expected, result); 
} 
+4

'AutoMoqCustomization' có thể cung cấp các lớp cơ sở trừu tượng cũng như giao diện. Là hàm tạo của 'ADataFeed' công khai? Nếu vậy, hãy bảo vệ nó. Đó là lỗi thiết kế với một hàm tạo công khai trên lớp trừu tượng –

+0

Rất thú vị. Ok, moq xử lý một constructor công khai trên lớp trừu tượng ... autofixture không. Không làm việc với một hàm tạo riêng và cả hai đều làm việc khi nó được bảo vệ. Tôi sẽ nói với bạn rằng đó là một lỗi thiết kế ... một câu hỏi khác cho một ngày khác. Trong thời gian tạm thời, tôi sẽ sử dụng bảo vệ. – cocogorilla

+0

FTR: http://msdn.microsoft.com/en-us/library/vstudio/ms229047(v=vs.100).aspx –

Trả lời

1

Lớp trừu tượng với người xây dựng phải được đánh dấu là được bảo vệ. AutoFixture sẽ không chương trình chống lại các lớp trừu tượng khi hàm tạo được đánh dấu công khai, vì đây là lỗi thiết kế.