2013-11-20 41 views
0

從概念上講,我對事件本身有點失落,所以這裏的任何信息都會有幫助。單元測試Vb.net中的RaiseEvent僅使用MSTest + MSFakes

具體來說,我有一個非常簡單的屬性設置這引起了一個事件,我想確認

  1. 是引發此事件也
  2. 適當的參數已經傳遞到所述事件。 (雖然2.對於這個特定事件可能是不必要的)。

我試圖在我的單元測試項目中包含開銷,也就是說,避免在被測試的項目中進行任何額外的編碼。

代碼如下。

Public Class myItem 

Shared Event ItemOpened As EventHandler(Of EventArgs) 

......... 

Public Property Open() As Boolean 
    Get 
     Return mOpen 
    End Get 
    Set(ByVal value As Boolean) 
     mOpen = value 
     RaiseEvent ItemOpened(Me, New EventArgs) 
    End Set 
    End Property 

所有代碼都在VB.net中完成,這是爲什麼我還沒有找到足夠好的資源在線的主要原因。此外,我沒有使用第三方模擬框架,如Nunit或RhinoMock,而只使用VS2012中的單元測試框架中構建的MS。

此外,類似地,我想測試某些setter方法例如如下FirePropertyChangedNotification() ....

Public Property myBool() As Boolean 
Set(ByVal Value As Boolean) 
     FirePropertyChangedNotification("myBool") 
     mViewOnly = Value 
End Set 
End Property 

在其FirstPropertyChangedNotification()是如下.....

Protected Sub FirePropertyChangedNotification(ByVal propName As String) 

    If Not Initializing Then 
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName)) 
    RaiseEvent EntityChanged(Me, New PropertyChangedEventArgs(propName)) 
    End If 
End Sub 

回答

1

我不確定你爲什麼想在這裏使用Fakes ...你可以在你的測試中使用一個委託來訂閱你的事件。現在從測試中更改屬性並設置一個布爾值,或者甚至將assert放置在委託中。

這是我在C#中做的事情,自動轉換爲VB.NET(在我的情況下,它非常生鏽......)這在我的機器上工作。從VB.NET專家的任何改進,歡迎:

Imports Microsoft.VisualStudio.TestTools.UnitTesting 
Imports System.ComponentModel 

Namespace UnitTestProject2 
    Public Class Sut 
     Implements INotifyPropertyChanged 

     Public Property StringProperty() As String 
      Get 
       Return String.Empty 
      End Get 
      Set(value As String) 
       OnPropertyChanged("StringProperty") 
      End Set 
     End Property 

     Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

     Protected Sub OnPropertyChanged(ByVal name As String) 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) 
     End Sub 
    End Class 

    <TestClass> _ 
    Public Class UnitTest1 
     <TestMethod> _ 
     Public Sub TestMethod1() 
      Dim sut As New Sut() 
      Dim triggered = False 

      AddHandler sut.PropertyChanged, Sub(o, e) 
               Assert.AreEqual("StringProperty", e.PropertyName) 
               triggered = True 
              End Sub 
      sut.StringProperty = "test" 

      Assert.IsTrue(triggered) 
     End Sub 

     <TestMethod> _ 
     Public Sub TestMethod2() 
      Dim sut As New Sut() 
      Dim triggered = False 

      AddHandler sut.PropertyChanged, Sub(o, e) 
               Assert.AreSame(sut, o) 
               triggered = True 
              End Sub 

      sut.StringProperty = "test" 

      Assert.IsTrue(triggered) 
     End Sub 
    End Class 
End Namespace 
+0

具有接口與轉換.....班「蘇特」必須實現麻煩「事件的PropertyChanged(發送者爲對象,E作爲PropertyChangedEventArgs)」「系統.ComponentModel.INotifyPropertyChanged' –

+0

只需用你自己的類代替'Sut'。我相信你已經在你自己的代碼中正確實現了這個事件:) – jessehouwing

+0

這段代碼現在可以在我的機器上運行。生鏽是輕描淡寫...... – jessehouwing

相關問題