2009-09-15 40 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