2015-02-11 15 views
14

Tôi có một phương pháp sử dụng HostingEnvironment.QueueBackgroundWorkItem mà tôi muốn thử nghiệm đơn vị một số hành vi trước khi cuộc gọi này, tuy nhiên, các thử nghiệm là không có System.InvalidOperationException : Operation is not valid due to the current state of the object.Mock HostingEnvironment.QueueBackgroundWorkItem trong thử nghiệm xUnit

Tôi nghi ngờ điều này tôi cần phải thử các HostingEnvironment nhưng không biết làm thế nào để.

Trả lời

28

Để giải quyết vấn đề này tôi định nghĩa một giao diện

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

Trong mã sản xuất tôi tiêm thực hiện

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

Trong mã kiểm tra tôi tiêm thực hiện

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

Tôi nghĩ rằng đây là một Giải pháp OK vì các bài kiểm tra đơn vị hoạt động và các lớp của tôi xếp hàng các nhiệm vụ nền được tách riêng từ HostingEnvironment.

+3

Đây là cách cần giải mã d! Nên là câu trả lời được chấp nhận! – Mrchief

5

tôi đã kết thúc làm điều này để giữ cho mọi thứ đơn giản:

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

Sau đó, để bắn một công việc đơn giản:

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

gọn gàng vì gọi HostingEnvironment.QueueBackgroundWorkItem bất kể có một ASP.NET Một chút Sau đó, miền AppDomain sẽ bắt được số InvalidOperationException là:

public static void QueueBackgroundWorkItem(Action<CancellationToken> workItem) 
{ 
    if (HostingEnvironment.IsHosted) 
    { 
     HostingEnvironment.QueueBackgroundWorkItem(workItem); 
    } 
    else 
    { 
     workItem.Invoke(new CancellationToken()); 
    } 
} 
Các vấn đề liên quan