2015-08-13 1 views
1

Я пытаюсь найти способ написать тест интеграции для компонента, который зависит от HttpContext и использует файлы cookie.Интеграционные тесты с зависимостями от куки ответов откликов System.NullReferenceException

Моя проблема - это исключение, когда оно пытается написать что-либо в файлы cookie ответов.

Вот несколько примеров, чтобы воспроизвести проблему.

using System.IO; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Web; 
using Moq; 

namespace CookieTest 
{ 
    [TestClass] 
    public class CookieTest 
    { 
     private Mock<HttpContextBase> _httpContextMock; 

     [TestInitialize] 
     public void SetUp() 
     { 
      var request = new HttpRequest(null, "http://localhost/", ""); 
      var stream = new MemoryStream(); 
      var sw = new StreamWriter(stream); 
      var response = new HttpResponse(sw); 
      _httpContextMock = new Mock<HttpContextBase>(); 

      _httpContextMock.Setup(t => t.Request).Returns(new HttpRequestWrapper(request)); 
      _httpContextMock.Setup(t => t.Response).Returns(new HttpResponseWrapper(response)); 
     } 

     [TestMethod] 
     public void TestCookieWrite() 
     { 
      var httpContext = _httpContextMock.Object; 
      var expectedValue = "value"; 
      var cookies = httpContext.Response.Cookies; 
      var cookieToAdd = new HttpCookie("key", expectedValue); 

      // to illustrate that these are not null 
      Assert.IsNotNull(cookies); 
      Assert.IsNotNull(cookieToAdd); 

      // System.NullReferenceException: Object reference not set to an instance of an object. 
      // at System.Web.HttpCookieCollection.Add(HttpCookie cookie) 
      // at CookieTest.CookieTest.TestCookieWrite() in CookieTest.cs: line 41 
      cookies.Add(cookieToAdd); 

      Assert.AreEqual(expectedValue, httpContext.Response.Cookies.Get("key")); 
     } 
    } 
} 
+0

Это полный трассировки стека? Кажется странным, поскольку метод '' Add' (http://referencesource.microsoft.com/#System.Web/HttpCookieCollection.cs,169) не похож на то, что он должен выбросить NRE самостоятельно ... –

+0

Hi @JamesThorpe, да, это полная трассировка стека. Я немного озадачен. –

+0

Я также посмотрел на источник .NET и не могу найти, где это происходит Неправильно –

ответ

1

Ответ содержит частное поле под названием _context, которая требует ссылки на обоих себя и запрос, если вы установите в поле следующим образом:

var response = new HttpResponse(sw); 
response.GetType() 
     .GetField("_context", BindingFlags.NonPublic | BindingFlags.Instance) 
     .SetValue(response, new HttpContext(request, response)); 
_httpContextMock = new Mock<HttpContextBase>(); 

Тогда NullReferenceException будет больше не брошен. Кроме того, тест был провал, как вы сравните HttpCookie объект со строкой, вам необходимо изменить утверждение, чтобы проверить против Value собственности как так:

Assert.AreEqual(expectedValue, httpContext.Response.Cookies.Get("key").Value); 
+0

Немного неудобно, но определенно работает :) спасибо. –

Смежные вопросы