2010-09-30 86 views
5

Visual Studio 2010似乎混合了上面提到的庫。爲什麼Visual Studio 2010會混合使用System.Web和System.Web.Abstractions?

此代碼示例來自Steven Sanderson的書「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行字「斷言」下)類型「System.Web.HttpResponseBase」在定義未引用的程序集。您必須添加對程序集「System.Web.Abstractions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35」的引用。
  2. (第25行和第26行在「Cookies」一詞下)'System.Web.HttpResponseBase'不包含'Cookies'的定義,也沒有接受類型爲「System.Web.HttpResponseBase」的第一個參數的擴展方法'Cookies' '可以找到(你是否錯過使用指令或程序集引用?)

如果我添加「使用System.Web.Abstractions」到代碼文件並生成項目,上述錯誤消失,但隨後那麼我得到以下錯誤:

  1. 命名空間'System.Web'中不存在類型或名稱空間名稱'Abstractions'(您是否缺少程序集參考?)

有趣的是,在這兩種情況下,當我在Response之後放置一個點時,Intellisense會提示我提供正確的選擇。 Response.Cookies)。看起來Intellisense有關於HttpResponseBase的信息,即構建引擎沒有。

任何想法可能會導致此?

回答

7

您可以仔細檢查您的項目參考文獻中是否有System.WebSystem.Web.Abstractions

使用從Apress網站下載的圖書的源代碼,我可以無誤地構建您的代碼,但是當我刪除對System.Web.Abstractions的引用時,我會看到相同的行爲,包括您記下的intellisense信息提示。

+1

這是一個錯過的參考。我正在查看WebUI項目中的System.Web.Abstractions參考,而不是UnitTests項目。謝謝。這種行爲仍然有點奇怪。 – Jason 2010-09-30 21:53:43

+0

甜。謝謝 ! – 2012-01-10 19:17:49

4

問題是包裝類型(HttpContextWrapper和朋友)位於名爲System.Web.Abstractions的程序集中,但位於System.Web名稱空間中(這就是爲什麼在此添加using語句不是解決方案的原因)。

在那裏留下using System.Web,並確保你有一個參考(在項目文件中)到System.Web.Abstractions程序集,並且一切都應該很好。

相關問題