【问题标题】:Events not being raised by FileSystemWatcher in an integration test?FileSystemWatcher 在集成测试中没有引发事件?
【发布时间】:2012-08-17 18:25:46
【问题描述】:

我正在尝试对我的班级进行集成测试,以确保引发我期望引发的事件:

    '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

这是我在课堂上设置 FileSystemWatcher 对象的方法:

    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

我在 OneNetworkFileChange 子中放置了一个断点。断点永远不会被击中。我已经验证了文件实际上在 ChangeNetworkFile 中被更改了我什至复制了代码(除了硬编码路径)并将其复制到我在单元测试期间运行的 Windows 应用程序中。它在我的 Windows 应用程序中工作。我在这里错过了什么?

【问题讨论】:

    标签: events integration-testing mstest filesystemwatcher


    【解决方案1】:

    经过一番测试终于弄明白了。好吧,上面的 EventCalled 从来都不是真的原因是因为测试的“windows 消息泵”被阻止了。该事件将被触发,但只有在测试完成后(当然这很晚)。那么如何解决呢?它有点乱,我不喜欢它,但我引用了 System.Windows.Forms.dll 并称为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
    

    直到有人告诉我更好的方法,这似乎是解决方案。

    【讨论】:

    • 嗯,我从来没有新的他们被这样触发。一件事是您不必担心以这种方式以线程安全的方式处理事件。就我个人而言,我已经不再依赖它,而是更喜欢在单独的线程中进行轮询(但是我想我现在知道为什么它当时会失败)。
    【解决方案2】:

    可能它的过滤器 (string.Empty) 显然只查看没有扩展名的文件(这是一个假设)。

    试试"*.*" 或类似的东西:

    _watcher = New FileSystemWatcher(value.Replace(Path.GetFileName(value), string.Concat("*.", Path.GetExtension(value))))
    

    【讨论】:

    • 是的,不是这样。我很确定这不是因为就像我上面说的那样,我将代码按原样粘贴到一个单独的应用程序中,并且效果很好。我不知道 mstest 正在做的事情是否出于某种原因压制了事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多