【问题标题】:Writing Unit test for event handlers C#为事件处理程序 C# 编写单元测试
【发布时间】:2016-02-01 05:49:45
【问题描述】:

我需要一个测试用例来测试事件处理程序。在我的项目中,我只是使用事件处理程序将总文件大小值从 Model 类传递给 ViewModel 类。

为事件处理程序编写测试用例的所有方法是什么?在我的测试用例中我必须做什么?

我的测试用例不工作..

查看模型

public RipWatcherWindowShellViewModel(IWorkflowManager workflowManager)
{
    WorkflowManager = workflowManager;
    workflowManager.GetTotalUsfFileSize += workflowManager_GetTotalFileSize;
}


/// <summary>Delegate for workflowManager get total file size</summary>
/// <param name="sender">The sender object</param>
/// <param name="e">The FileSizeChangedEventArgs object</param>
public void workflowManager_GetTotalFileSize(object sender, FileSizeChangedEventArgs e)
{
    if(e.FileSize== 0)
    {
        throw new ArgumentException("We cannot calculate progress percentage because total file size is 0");
    }
    TotalUsfFileSize = e.FileSize;
}

型号

public class WorkflowManager
{

    public event EventHandler<FileSizeChangedEventArgs> GetTotalUsfFileSize;

    public void StartWorkflow()
    {           
        totalFileSize= jobWatcher.StartWatching(HotFoldersCollection);

         //Event handler Raised here....

        GetTotalUsfFileSize.SafeInvoke(this, new FileSizeChangedEventArgs(totalFileSize));
     }
  }

事件处理程序

public class FileSizeChangedEventArgs:EventArgs
{

    public FileSizeChangedEventArgs (Double fileSize)
    {
        FileSize = fileSize;
    }

    public Double FileSize
    {
        get;
        private set;
    }
}

我的测试用例

[Test]
public void IsGetTotalFileSizeEventFired()
{
    worflowManager = new Mock<IWorkflowManager>().Object;

    ripWatcherWindowShellViewModel = new RipWatcherWindowShellViewModel(worflowManager);
    ripWatcherWindowShellViewModel.GetTotalUsfFileSize += delegate { eventRaised = true; };

    Assert.IsTrue(eventRaised);
}

【问题讨论】:

  • 你想测试什么?您在哪里举办活动?
  • ripWatcherWindowShellViewModel.TransferredFileSize += ... 之后需要一些东西来引发事件。
  • 我认为您需要将 EventHandler 和“业务”逻辑分开。在 ViewModel 中创建一个以文件大小为参数的方法。并为该方法编写测试。对于 EventHandler 足以测试该事件已引发并执行您的处理程序。

标签: c# unit-testing


【解决方案1】:

如果您正在测试您的事件处理程序是否有效,只需使用您要测试的事件参数调用事件处理程序即可。

在您的情况下,我假设您想测试您的事件是否已引发。这将取决于您的StartWorkFlow 中的任何调用是否具有任何外部依赖项(例如对实际文件系统的依赖。如果有,那么您将进入集成测试领域,不再是单元测试领域)。在这种情况下,请确保 jobWatcher 也被模拟,或将 StartWorkFlow 设为虚拟,以便您可以更改其行为以适应您的测试。

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2019-08-17
    • 2019-04-25
    相关资源
    最近更新 更多