2010-09-30 7 views
5

Visual Studio 2010 parece estar mezclando las bibliotecas mencionadas anteriormente.¿Por qué Visual Studio 2010 mezcla System.Web And System.Web.Abstractions?

Este ejemplo de código procede del libro "Pro ASP.NET MVC2 Framework" de Steven Sanderson.

[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); 
} 

Mi proyecto hace referencia a las bibliotecas System.Web y System.Web.Abstractions.

Cuando el archivo de código es único "using System.Web" Tengo dos errores:

  1. (Línea 25 bajo la palabra 'Assert') El tipo 'System.Web.HttpResponseBase' se define en una ensamblado que no está referenciado. Debe agregar una referencia al ensamblado 'System.Web.Abstractions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35'.
  2. (líneas 25 y 26 debajo de la palabra 'Cookies') 'System.Web.HttpResponseBase' no contiene una definición para 'Cookies' y ningún método de extensión 'Cookies' que acepta un primer argumento de tipo 'System.Web.HttpResponseBase 'podría encontrarse (¿falta una directiva using o una referencia de ensamblado?)

Si agrego "using System.Web.Abstractions" al archivo de código y construyo el proyecto, los errores anteriores desaparecen pero luego entonces recibo el siguiente error:

  1. El tipo o el nombre del espacio de nombres 'Abstracciones' no existe en el espacio de nombres 'System.Web' (¿falta un ensamblaje? referencia?)

Curiosamente, en ambos casos cuando coloco un punto después de la respuesta, Intellisense me indica las opciones correctas (es decir, Response.Cookies). Parece que Intellisense tiene información sobre HttpResponseBase que el motor de compilación no tiene.

¿Alguna idea de qué puede estar causando esto?

Respuesta

7

¿Puede verificar que bajo las referencias del proyecto tiene ambos System.Web y System.Web.Abstractions?

Utilizando el código fuente del libro descargado desde el sitio Apress, puedo construir su código sin errores, pero cuando elimino la referencia a System.Web.Abstractions, obtengo el mismo comportamiento, incluyendo las indicaciones de información intellisense que anotó.

+1

Era una referencia perdida. Estaba viendo la referencia System.Web.Abstractions en mi proyecto WebUI en lugar del proyecto UnitTests. Gracias. El comportamiento sigue siendo algo extraño. – Jason

+0

Dulce. Gracias ! –

4

El problema es que los tipos de contenedor (HttpContextWrapper y amigos) viven en un ensamblado llamado System.Web.Abstractions, pero están en el espacio de nombres System.Web (por eso agregar una declaración de uso no es una solución aquí).

Deje using System.Web allí y asegúrese de tener una referencia (en el archivo de proyecto) al ensamblado System.Web.Abstractions, y todo debería ir bien.