Vb.net Moq、VB、HttpResponseBase和标头

Vb.net Moq、VB、HttpResponseBase和标头,vb.net,moq,Vb.net,Moq,我正在用VB中的Moq编写一些自定义控制器的测试堆。到目前为止,我还没有处理过VB Lambda的缺点,因为我只处理过moqed属性或方法 直到今天早上,我还尝试使用Cassini对我的代码运行集成测试。我有使用Response.headers.add添加标题的代码。我这样做是为了在单元测试中使用Moq(HttpResponseBase的)和SetupGet for headers->NameValueCollection轻松获得headers集合。当然,除了集成管道模式下的IIS7之外,代码在

我正在用VB中的Moq编写一些自定义控制器的测试堆。到目前为止,我还没有处理过VB Lambda的缺点,因为我只处理过moqed属性或方法

直到今天早上,我还尝试使用Cassini对我的代码运行集成测试。我有使用Response.headers.add添加标题的代码。我这样做是为了在单元测试中使用Moq(HttpResponseBase的)和SetupGet for headers->NameValueCollection轻松获得headers集合。当然,除了集成管道模式下的IIS7之外,代码在任何情况下都会阻塞

因此,我将代码改为使用Response.AddHeader,这意味着我的单元测试失败。由于我在VB中,我看不到将AddHeader调用映射到Headers集合的合理方法,因为函数()在VB中需要返回值

我在这里看到了一些关于Moq和VB的条目,但是没有人真正有将sub映射到Moq中其他内容的问题


有人在VB中使用Moq解决过这种特殊情况吗。为什么在您发布后,解决方案总是变得明显::-)

这是丑陋的,但它的工作

  • 子类HttpResponseBase
  • 模拟它并将CallBase设置为True
然后重写Add/AppendHeader以执行Headers.Add。现在,您可以捕获人们在代码中使用的任何变体,因为它们都属于Response.Headers集合。不管使用哪种方法,realy代码都可以工作

不像在C#中使用回调时使用Moqing Add/Append那样干净,但它确实有效

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