Moq,VB,HttpResponseBase和Headers

时间:2009-09-15 15:18:26

标签: vb.net moq

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

直到今天早上我还尝试使用Cassini对我的代码运行集成测试。我有使用Response.Headers.Add添加标头的代码。我这样做了所以我可以使用Moq(Of HttpResponseBase)和一个SetupGet for Headers-> NameValueCollection在单元测试中轻松获得头文件集合。当然,代码在集成管道模式下以IIS7以外的任何方式进行扼流。

因此,我将代码更改为使用Response.AddHeader,这意味着我的单元测试失败了。因为我在VB中,所以我可以'看到一种理智的方式将调用AddHeader映射到Headers集合,因为Function()需要VB中的返回值。

我在这里看到一些关于Moq和VB的条目,但是没有人真正将子映射到Moq中的其他东西。

有没有人使用Moq在VB中处理这种特殊情况?

1 个答案:

答案 0 :(得分:1)

唉。为什么解决方案总是在你发布之后变得明显。 : - )

这很难看,但确实有效。

  • 子类HttpResponseBase。
  • 模拟并将CallBase设置为True。

然后重写Add / AppendHeader以执行Headers.Add。现在您可以捕获人们在代码中使用的任何变体,因为它们都属于Response.Headers集合。无论您使用哪种方法,真实代码都可以使用。

不像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