2015-11-20 14 views
5

Có thể viết các phương thức, chỉ có thể gọi bằng kiểm tra đơn vị không? Vấn đề của tôi là khung của chúng tôi chứa rất nhiều lớp học Singleton, khiến cho việc kiểm thử đơn vị khá khó khăn một chút. Ý tưởng của tôi là tạo một giao diện đơn giản như thế này:Chỉ có thể gọi phương thức từ thử nghiệm đơn vị

public interface IUnitTestClearable 
{ 
    void ClearForUnitTest(); 
} 

Phương pháp này sẽ được gọi là các trường hợp đơn "đặt lại" để xử lý đơn vị tốt hơn. Nhưng phương pháp này chỉ nên được gọi từ các lớp/các cá thể thử nghiệm đơn vị. Điều này có thể không?

+1

Chỉ cần nhớ rằng phương pháp tư nhân có thể được gọi từ các nguồn bên ngoài là tốt. –

Trả lời

8

Bạn có thể tạo ra một phương pháp nội bộ và tập InternalsVisibleTo. Bằng cách này, bạn cho lắp ráp khác truy cập vào internals của bạn

http://geekswithblogs.net/jwhitehorn/archive/2007/11/09/116750.aspx

nhưng Tim là ngay trước khi tôi khi tôi kết thúc chuyện này :)

Trong tập tin dự án của bạn, AssemblyInfo.cs, thiết

[assembly: InternalsVisibleTo("Application.Test")] 

hoặc nếu bạn có một hội đồng đã ký

[assembly: InternalsVisibleTo("Application.Test, PublicKey=KEYHERE")] 
+0

Vẫn là câu trả lời đúng, +1 từ tôi :) –

1

Bạn có thể không muốn trưng ra tất cả các phương thức riêng cho các bài kiểm tra đơn vị của bạn, vì nó có thể gây nhầm lẫn, vì vậy chỉ cần thêm một phương thức riêng cho các lớp singleton của bạn.

public class MySingleton 
{ 
    private void ClearForUnitTest() 
    { 
     Console.WriteLine("Cleared."); 
    } 
} 

Tạo tiện ích mở rộng được sử dụng trong các bài kiểm tra đơn vị của bạn.

public static class PrivateExtensions 
{ 
    public static void ClearForUnitTest<T>(this T instance) 
    { 
     var method = typeof(T).GetMethod("ClearForUnitTest", BindingFlags.NonPublic | BindingFlags.Instance); 
     method.Invoke(instance, null); 
    } 
} 

Sử dụng như nó sẽ được công khai

private static void Main(string[] args) 
{ 
    var ms = new MySingleton(); 
    ms.ClearForUnitTest(); 
} 

lợi nhuận

+0

Dường như cũng là một lựa chọn tốt. Cảm ơn bạn! – BendEg

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