2015-02-11 45 views
14

我使用 HostingEnvironment.QueueBackgroundWorkItem我这个电话之前要进行单元测试的一些行为的方法,但是,测试与System.InvalidOperationException : Operation is not valid due to the current state of the object.模拟HostingEnvironment.QueueBackgroundWorkItem中的xUnit测试

失败,我怀疑这一点,我需要模拟HostingEnvironment但不知道如何。

回答

28

要解决这个问题,我定义的接口

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

+3

这就是它应该如何解耦d!应该是被接受的答案! – Mrchief 2015-06-19 03:09:20

5

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

/// <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 
}); 
1

一点点不是调用HostingEnvironment.QueueBackgroundWorkItem不管是否有一个ASP.NET整洁AppDomain然后捕捉InvalidOperationException是:

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