Search code examples
eventsintegration-testingmstestfilesystemwatcher

Events not being raised by FileSystemWatcher in an integration test?


I'm trying to run an integration test on my class to make sure an event i expect to be raised is raised:

    'integration test not unit test
<TestMethod()>
Public Sub Change_Network_File_Causes_Event_To_Be_Raised()
    Dim EventCalled As Boolean
    Dim deployChk = New TRSDeploymentCheck("foo")
    deployChk._localFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestFiles\SameLocalGUIDFile.txt")
    AddHandler deployChk.DeploymentNeeded, Sub() EventCalled = True
    deployChk.NetworkFileLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestFiles\SameNetGUIDFile.txt")
    ChangeNetworkFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestFiles\SameNetGUIDFile.txt"))
    Assert.IsTrue(EventCalled)


End Sub

Here is how i setup the FileSystemWatcher Object in my class:

    Friend Property NetworkFileLocation As String
    Set(value As String)
        _netFileLoc = value
        If File.Exists(value) Then
            _watcher = New FileSystemWatcher(value.Replace(Path.GetFileName(value), String.Empty))
            _watcher.EnableRaisingEvents = True
            AddHandler _watcher.Changed, AddressOf OnNetworkFileChanged
        End If
    End Set
    Get
        Return _netFileLoc
    End Get
End Property  

Private Sub OnNetworkFileChanged(source As Object, e As FileSystemEventArgs)
    If IsDeploymentNeeded() Then RaiseEvent DeploymentNeeded()
End Sub

I put a breakpoint in the OneNetworkFileChange sub. The breakpoint is never hit. I have verified the file is actually being changed in ChangeNetworkFile I even copied the code (except for hard coding the path) and copied it into a windows app which i ran during my unit test. It worked in my windows app. What am i missing here?


Solution

  • Finally figured it out after some testing. Well the reason EventCalled is never true above is because the "windows message pump" for the test is blocked. The event will be fired but only after the test completes (which of course is to late). So how do you fix it? Its kind of messy and i don't like it but i referenced System.Windows.Forms.dll & called Application.DoEvents()

            'integration test not unit test
    <TestMethod()>
    Public Sub Change_Network_File_Causes_Event_To_Be_Raised()
        Dim EventCalled As Boolean
        Dim deployChk = New TRSDeploymentCheck("foo")
        deployChk._localFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestFiles\SameLocalGUIDFile.txt")
        AddHandler deployChk.DeploymentNeeded, Sub() EventCalled = True
        deployChk.NetworkFileLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestFiles\SameNetGUIDFile.txt")
        ChangeNetworkFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestFiles\SameNetGUIDFile.txt"))
        Application.DoEvents()
        Assert.IsTrue(EventCalled)
    
    End Sub
    

    Until some tells me a better way this appears to be the solution.