【问题标题】:Mock HostingEnvironment.QueueBackgroundWorkItem in xunit testMock Hostingenvironment.queuebackgroundItem在XUnit测试中
【发布时间】:2015-04-11 22:56:57
【问题描述】:

我有一个方法使用 HostingEnvironment.QueueBackgroundWorkItem 我希望在此调用之前对某些行为进行单元测试,但是,System.InvalidOperationException : Operation is not valid due to the current state of the object. 测试失败

我怀疑我需要模拟 HostingEnvironment 但不知道如何。

【问题讨论】:

    标签: moq xunit .net-4.5.2


    【解决方案1】:

    为了解决这个问题,我定义了一个接口

    public interface ITaskScheduler
    {
        void QueueBackgroundWorkItem(Action<CancellationToken> workItem);
    }
    

    在生产代码中我注入实现

    public class AspNetTaskScheduler : ITaskScheduler
    {
        public void QueueBackgroundWorkItem(Action<CancellationToken> workItem)
        {            
            HostingEnvironment.QueueBackgroundWorkItem(workItem);
        }
    }
    

    在测试代码中我注入实现

    public class TaskScheduler : ITaskScheduler
    {
        public void QueueBackgroundWorkItem(Action<CancellationToken> workItem)
        {
            workItem.Invoke(new CancellationToken());
        }
    }
    

    我认为这是一个不错的解决方案,因为单元测试有效,并且我的队列后台任务的类与 HostingEnvironment 分离。

    【讨论】:

    • 这就是解耦的方式!应该是公认的答案!
    【解决方案2】:

    我最终这样做是为了让事情变得简单:

    /// <summary>
    /// add some jobs to the background queue
    /// </summary>
    public static class BackgroundTaskScheduler
    {
        /// <summary>
        /// send the work item to the background queue
        /// </summary>
        /// <param name="workItem">work item to enqueue</param>
        public static void QueueBackgroundWorkItem(Action<CancellationToken> workItem)
        {
            try
            {
                HostingEnvironment.QueueBackgroundWorkItem(workItem);
            }
            catch (InvalidOperationException)
            {
                workItem.Invoke(new CancellationToken());
            }
        }
    }
    

    然后简单地解雇工作:

    BackgroundTaskScheduler.QueueBackgroundWorkItem(ct =>
    {
         // bla
    });
    

    【讨论】:

      【解决方案3】:

      不管是否有 ASP.NET AppDomain 都比调用 HostingEnvironment.QueueBackgroundWorkItem 更简洁,然后捕获 InvalidOperationException 是:

      public static void QueueBackgroundWorkItem(Action<CancellationToken> workItem)
      {
          if (HostingEnvironment.IsHosted)
          {
              HostingEnvironment.QueueBackgroundWorkItem(workItem);
          }
          else
          {
              workItem.Invoke(new CancellationToken());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-11
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        • 1970-01-01
        相关资源
        最近更新 更多