2013-07-24 35 views
5

Tôi đã sau (di sản, thừa hưởng từ người tiền nhiệm) VB.Net (framework 2.0) Lớp học và phương pháp mà tạo ra một hệ thống Event Log vào Ngoại lệ:Shim một khoảng trống phương pháp

Public Interface IMyClass 

    Function MyMethod(ByVal aValue As String) As Date 

End Interface 

Public Class MyClass 

    Implements IMyClass 

    Public Function MyMethod(ByVal aValue As String) As Date Implements IMyClass.MyMethod 

     Try 

      ' Calculate return date based on aValue 

     Catch ex As Exception 
      Call MyUtilityClass.LogError("MyClass", "MyMethod", ex) 
      Throw 
     End Try 

    End Function 

End Class 

Partial Public NotInheritable Class MyUtilityClass 

    Public Shared Sub LogError(ByVal className As String, 
           ByVal methodName As String, 
           ByVal ex As Exception) 

     ' Write details to Event Log 
    End Sub 

End Class 

Tôi cố gắng để kiểm tra điều này trong một dự án C# (framework 4.5) Unit Test, và một phần của logic yêu cầu rằng aValue là hai số được phân tách bằng dấu phẩy - do đó ném một ngoại lệ và bản ghi sự kiện nếu không.

tôi đã thiết lập các Unit Test sau đây để đảm bảo rằng các ngoại lệ được ném một cách chính xác:

[TestClass] 
public class MyClassUnitTest 
{ 
    private readonly StubMyClass myClass = new StubMyClass(); 

    [TestMethod] 
    [ExpectedException(typeof(InvalidCastException))] 
    public void TestMyMethodInvalidMissingNumber() 
    { 
     this.myClass.MyMethod("0,"); 
    } 
} 

này tất cả các công trình độc đáo và thử nghiệm đi, như logic trong MyMethod gây ra ngoại lệ dự kiến. Tuy nhiên, tôi không muốn ghi nhật kí sự kiện. Vì vậy, làm cách nào để Shim số MyUtitlityClass chặn cuộc gọi đến LogErrorvà không làm gì thay thế?

Tất cả các ví dụ Fakes tôi đã thấy được các phương pháp mà trả về một giá trị giả (và là tất cả viết bằng C#!) Khi tôi cố gắng và thực hiện một mô hình như vậy, nó mang lại cho một lỗi mà LogError không có một getter.

+0

xin lỗi về C# comments trong mã VB.Net - renderer phát hiện những nhận xét VB.Net ' '' như một terminator chuỗi và các định dạng không đúng – Shevek

+1

@ Meta-Knight - cảm ơn cho tôi thấy làm thế nào để có được bình luận VB! – Shevek

Trả lời

4

Tôi nghĩ rằng bạn đang tìm kiếm cái gì đó dọc theo dòng:

Using context = ShimsContext.Create() 
    ShimMyUtilityClass.LogStringStringException = 
     Sub(aClass As String, aMethod As String, anException As Exception) 
     End Sub 
End Using 

Hoặc, trong C#:

using (context = ShimsContext.Create()) { 
    ShimMyUtilityClass.LogStringStringException = 
     (string aClass, string aMethod, Exception anException) => { }; 
} 
+0

Tuyệt vời, hoạt động rực rỡ. Các bit tôi đã mất là trống '{}' – Shevek

0

Trước tiên, bạn cần phải tạo ra một hội đồng giả của assembly chứa MyUtilityClass . Sau đó, sử dụng thể hiện tạm thời của lớp MyUtility giả lập phương thức LogError. Sau đây có thể giúp:

 using (ShimsContext.Create()) 
     { 
      ShimMyUtilityClass temp = new ShimMyUtilityClass(); 
      temp.LogStringStringException = .... 
      this.myClass.MyMethod("0,"); 
     } 
+0

'LogStringStringException' không xuất hiện trên đối tượng' temp' – Shevek

+0

Phương thức này là tĩnh, đó là lý do tại sao bạn cần đặt nó trên toàn bộ Shim, chứ không phải trên một cá thể của một Shim. – jessehouwing

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