2010-09-30 15 views
5

Visual Studio 2010 sembra mischiare le librerie sopra menzionate.Perché Visual Studio 2010 configura System.Web e System.Web.Abstractions?

Questo esempio di codice proviene dal libro "Pro ASP.NET MVC2 Framework" di 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); 
} 

Il mio progetto fa riferimento alle librerie System.Web e System.Web.Abstractions.

Quando il file di codice è solo "using System.Web" Ho due errori:

  1. (linea 25 sotto la parola 'Assert') Il tipo 'System.Web.HttpResponseBase' è definito in un assembly che non è referenziato. È necessario aggiungere un riferimento all'assembly 'System.Web.Abstractions, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35'.
  2. (righe 25 e 26 sotto la parola "cookie") "System.Web.HttpResponseBase" non contiene una definizione per "cookie" e nessun metodo di estensione "cookie" che accetta un primo argomento di tipo "System.Web.HttpResponseBase" 'potrebbe essere trovato (ti manca una direttiva using o un riferimento all'assembly?)

Se aggiungo "using System.Web.Abstractions" al file di codice e creo il progetto, gli errori precedenti vanno via ma poi quindi viene visualizzato il seguente errore:

  1. Il nome o lo spazio dei nomi 'Abstractions' non esiste nello spazio dei nomi 'System.Web' (manca un assembly riferimento?)

È interessante notare che in entrambi i casi quando inserisco un punto dopo Risposta, Intellisense mi suggerisce le scelte corrette (ad es. Response.Cookies). Sembra che Intellisense abbia informazioni su HttpResponseBase che il motore di generazione non ha.

Qualche idea di cosa potrebbe causare questo?

risposta

7

Si può controllare che sotto i riferimenti del progetto sia sia System.Web sia System.Web.Abstractions?

Utilizzando il codice sorgente per il libro scaricato dal sito di Apress, posso creare il codice senza errori, ma quando rimuovo il riferimento a System.Web.Abstractions, ottengo lo stesso comportamento, incluse le informazioni intellisense richieste.

+1

E 'stato un riferimento mancato. Stavo guardando il riferimento System.Web.Abstractions nel mio progetto WebUI piuttosto che il progetto UnitTests. Grazie. Il comportamento è ancora un po 'strano. – Jason

+0

Dolce. Grazie ! –

4

Il problema è che i tipi di wrapper (HttpContextWrapper e amici) vivono in un assembly denominato System.Web.Abstractions, ma si trovano nello spazio dei nomi System.Web (motivo per cui l'aggiunta di un'istruzione using non è una soluzione qui).

Lasciare lì using System.Web e assicurarsi di avere un riferimento (nel file di progetto) all'assembly System.Web.Abstractions e tutto dovrebbe andare bene.

Problemi correlati