加入会话的ASP.NET 5控制器单元测试

问题描述:

我们加入我们的ASP Web应用程序会话之后,现在我们的控制器单元测试失败:加入会话的ASP.NET 5控制器单元测试

data_browser.Tests.HomeControllerTests.Index [FAIL] 
    System.NullReferenceException : Object reference not set to an instance of an object 

测试失败上,我们使用会话声明:

HttpContext.Session.SetString("games", JsonConvert.SerializeObject(games)); 

看起来像需要添加会话服务。

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add MVC services to the services container. 
     services.AddMvc(); 
     services.AddSession(); 
     services.AddCaching(); 
    } 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     app.UseSession(); 
     ... 
    } 

但是,当我们的单元测试,我们只是实例化这样我们的控制器水木清华:

HomeController homeCtrler = new HomeController(); 
JsonResult jsonResult = (JsonResult)homeCtrler.Smth(); 
Assert.Eq(bla, bla); 

那么,在我们的应用程序是通过启动类的方法来完成有没有办法在asp.net 5单元测试中为控制器注入会话?

一个例子(从https://github.com/aspnet/MusicStore/blob/master/test/MusicStore.Test/ShoppingCartControllerTest.cs):

// Arrange 
var httpContext = new DefaultHttpContext(); 
httpContext.Session = new TestSession(); 

var controller = new ShoppingCartController() 
controller.ActionContext.HttpContext = httpContext; 

// Act 
var result = await controller.Index(); 

//-------------- 

class TestSession : ISession 
{ 
    private Dictionary<string, byte[]> _store 
     = new Dictionary<string, byte[]>(StringComparer.OrdinalIgnoreCase); 

    public IEnumerable<string> Keys { get { return _store.Keys; } } 

    public void Clear() 
    { 
     _store.Clear(); 
    } 

    public Task CommitAsync() 
    { 
     return Task.FromResult(0); 
    } 

    public Task LoadAsync() 
    { 
     return Task.FromResult(0); 
    } 

    public void Remove(string key) 
    { 
     _store.Remove(key); 
    } 

    public void Set(string key, byte[] value) 
    { 
     _store[key] = value; 
    } 

    public bool TryGetValue(string key, out byte[] value) 
    { 
     return _store.TryGetValue(key, out value); 
    } 
}