Không có hai cách về nó. Các đề xuất của ReSharper và một số tính năng hữu ích của C # sẽ không được sử dụng thường xuyên nếu bạn đang viết các bài kiểm tra đơn vị nguyên tử bị cô lập cho tất cả mã của mình.
Ví dụ, nếu bạn có một phương thức tĩnh và bạn cần loại bỏ nó, bạn không thể trừ khi bạn sử dụng khung cách ly dựa trên hồ sơ. Cách giải quyết tương thích với cuộc gọi là thay đổi đỉnh của phương thức để sử dụng ký hiệu lambda. Ví dụ:
TRƯỚC:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
SAU:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
Hai là tương thích cuộc gọi. Người gọi không phải thay đổi. Cơ thể của chức năng vẫn giữ nguyên.
Sau đó, trong mã Kiểm tra đơn vị của bạn, bạn có thể thực hiện cuộc gọi này như vậy (giả sử đó là trong một lớp có tên là Cơ sở dữ liệu):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Hãy cẩn thận để thay thế nó bằng giá trị ban đầu sau khi bạn hoàn thành. Bạn có thể thực hiện điều đó thông qua một lần thử / cuối cùng hoặc, trong phần kiểm tra đơn vị của bạn, phần được gọi sau mỗi bài kiểm tra, viết mã như thế này:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
cái này sẽ gọi lại bộ khởi tạo tĩnh của lớp bạn.
Lambda Funcs không hỗ trợ nhiều như các phương thức tĩnh thông thường, vì vậy phương pháp này có các tác dụng phụ không mong muốn sau:
- Nếu phương thức tĩnh là phương thức mở rộng, trước tiên bạn phải thay đổi nó thành phương thức không mở rộng. Resharper có thể làm điều này cho bạn tự động.
- Nếu bất kỳ kiểu dữ liệu nào của các phương thức tĩnh là một tổ hợp xen kẽ nhúng, chẳng hạn như đối với Office, bạn phải bọc phương thức, bọc kiểu hoặc thay đổi thành kiểu 'đối tượng'.
- Bạn không còn có thể sử dụng công cụ tái cấu trúc chữ ký thay đổi của Resharper.
Nhưng hãy nói rằng bạn tránh hoàn toàn thống kê và bạn chuyển đổi nó thành một phương thức cá thể. Nó vẫn không thể bị nhạo báng trừ khi phương thức này là ảo hoặc được triển khai như một phần của giao diện.
Vì vậy, trong thực tế, bất cứ ai đề xuất biện pháp khắc phục các phương thức tĩnh là biến chúng thành các phương thức cá thể, chúng cũng sẽ chống lại các phương thức cá thể không phải là ảo hoặc là một phần của giao diện.
Vậy tại sao C # có phương thức tĩnh? Tại sao nó cho phép các phương thức cá thể không ảo?
Nếu bạn sử dụng một trong hai "Tính năng" này, thì đơn giản là bạn không thể tạo các phương thức bị cô lập.
Vậy khi nào bạn sử dụng chúng?
Sử dụng chúng cho bất kỳ mã nào mà bạn không mong đợi bất kỳ ai muốn khai thác. Một số ví dụ: phương thức Format () của lớp String, phương thức WriteLine () của lớp Console, phương thức Cosh () của lớp Math
Và một điều nữa .. Hầu hết mọi người sẽ không quan tâm đến điều này, nhưng nếu bạn có thể về hiệu suất của một cuộc gọi gián tiếp, đó là một lý do khác để tránh các phương thức cá thể. Có những trường hợp khi đó là một hiệu suất hit. Đó là lý do tại sao các phương thức không ảo tồn tại ở nơi đầu tiên.