2009-09-15 39 views
0

我正在編寫一堆使用VB中的Moq的自定義控制器的測試過程。直到現在,我還沒有處理VB Lambda的缺點,因爲我只修改了屬性或方法。Moq,VB,HttpResponseBase和Headers

直到今天上午,我還嘗試使用卡西尼對我的代碼進行集成測試。我有代碼使用Response.Headers.Add添加標題。我這樣做,所以我可以很容易地在單元測試中使用Moq(Of HttpResponseBase)和一個用於Headers-> NameValueCollection的SetupGet獲得頭文件集合。當然,在集成管道模式下,IIS7以外的任何其他代碼都會窒息。

所以,我改變了我的代碼使用Response.AddHeader,這意味着我的單元測試失敗。而且由於我在VB中,因爲Function()需要VB中的返回值,所以我可以看到一種將AddHeader調用映射到Headers集合的理想方法。

我在這裏看到關於Moq和VB的一些條目,但是沒有人真的有將Mo映射到其他東西的問題。

有沒有人在VB中使用Moq來解決這種特殊情況?

回答

1

呃。爲什麼這些解決方案總是在你發佈之後變得明顯。 :-)

這是醜陋的,但它的工作原理。

  • 子類HttpResponseBase。
  • 嘲笑並設置Call​​Base爲True。

然後重寫Add/AppendHeader做Headers.Add。現在,您可以捕捉到任何人在代碼中使用的變體,因爲它們都屬於Response.Headers集合。無論您使用哪種方法,realy代碼都可以工作。

不像Moqing那樣乾淨在C#中添加/附加回調,但它確實有效。

Dim response As New Mock(Of CustomHttpResponse) 
response.SetupGet(Function(r As HttpResponseBase) r.Headers).Returns(New NameValueCollection) 
response.CallBase = True 


Public Class CustomHttpResponse 
    Inherits HttpResponseBase 

    Public Overrides Sub AddHeader(ByVal name As String, ByVal value As String) 
     Me.Headers.Add(name, value) 
    End Sub 
    Public Overrides Sub AppendHeader(ByVal name As String, ByVal value As String) 
     Me.Headers.Add(name, value) 
    End Sub 
End Class