Почему Visual Studio 2010 смешивает System.Web и System.Web.Abstractions? - PullRequest
6 голосов
/ 01 октября 2010

Visual Studio 2010, похоже, смешивает вышеупомянутые библиотеки.

Этот пример кода взят из книги «Pro ASP.NET MVC2 Framework» Стивена Сандерсона.

[TestMethod]
public void HomePage_Recognizes_New_Visitor_And_Sets_Cookie() 
{
    // Arrange: First prepare some mock context objects
    var mockContext = new Mock<HttpContextBase>();
    var mockRequest = new Mock<HttpRequestBase>();
    var mockResponse = new Mock<HttpResponseBase>();

    // The following lines define associations between the different mock objects
    // (i.e. tells Moq what alue to use for tMockContext.Request)
    mockContext.Setup(x=> x.Request).Returns(mockRequest.Object);
    mockContext.Setup(x=> x.Response).Returns(mockResponse.Object);
    mockRequest.Setup(x=> x.Cookies).Returns(new HttpCookieCollection());
    mockResponse.Setup(x=> x.Cookies).Returns(new HttpCookieCollection());

    var homeController = new HomeController();
    var requestContext = new RequestContext(mockContext.Object, new RouteData());
    homeController.ControllerContext = new ControllerContext(requestContext, homeController);

    // Act
    ViewResult viewResult = homeController.HomePage();

    // Assert
    Assert.AreEqual(String.Empty, viewResult.ViewName);
    Assert.IsTrue((bool)viewResult.ViewData["IsFirstVisit"]);
    Assert.AreEqual(1, homeController.Response.Cookies.Count);
    Assert.AreEqual(bool.TrueString, homeController.Response.Cookies["HasVisitedBefore"].Value);
}

Мой проект ссылается на библиотеки System.Web и System.Web.Abstractions.

Когда файл кода только «использует System.Web», я получаю две ошибки:

  1. (строка 25 под словом «Assert») Тип «System.Web.HttpResponseBase» определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку «System.Web.Abstractions, версия = 3.5.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35».
  2. (строки 25 и 26 под словом «Cookies») «System.Web.HttpResponseBase» не содержит определения «Cookies», а метод расширения «Cookies» не принимает первый аргумент типа «System.Web.HttpResponseBase 'может быть найдено (вам не хватает директивы using или ссылки на сборку?)

Если я добавлю «using System.Web.Abstractions» в файл кода и соберу проект, вышеуказанные ошибки исчезнут, но затем я получу следующую ошибку:

  1. Тип или имя пространства имен 'Abstractions' не существует в пространстве имен 'System.Web' (вам не хватает ссылки на сборку?)

Интересно, что в обоих случаях, когда я ставлю точку после Response, Intellisense предлагает мне правильный выбор (т. Е. Response.Cookies). Похоже, что Intellisense имеет информацию о HttpResponseBase, чего нет у движка сборки.

Есть идеи, что может быть причиной этого?

Ответы [ 2 ]

8 голосов
/ 01 октября 2010

Можете ли вы дважды проверить, что в разделе «Ссылки на проект» у вас есть и System.Web, и System.Web.Abstractions?

Используя исходный код для книги, загруженной с сайта Apress, я могу создать ваш код без ошибок, но когда я удаляю ссылку на System.Web.Abstractions, я получаю такое же поведение, включая информационные подсказки, которые вы отмечали.

4 голосов
/ 18 февраля 2011

Проблема заключается в том, что типы обёрток (HttpContextWrapper и друзья) находятся в сборке с именем System.Web.Abstractions, но находятся в пространстве имен System.Web (поэтому добавление оператора using здесь не является решением) .

Оставьте using System.Web там и убедитесь, что у вас есть ссылка (в файле проекта) на сборку System.Web.Abstractions, и все должно идти нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...