Moq、VB、HttpResponseBase 和标头

发布于 2024-08-05 00:12:36 字数 530 浏览 2 评论 0原文

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

直到今天早上,我尝试使用 Cassini 对我的代码运行集成测试。我有使用 Response.Headers.Add 添加标头的代码。我这样做是为了可以使用 Moq(Of HttpResponseBase) 和 Headers->NameValueCollection 的 SetupGet 在单元测试中轻松获取标头集合。当然,代码在集成管道模式下的 IIS7 以外的任何环境中都会阻塞。

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

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

有没有人在 VB 中使用 Moq 解决过这种特殊情况?

I'm in the process of writing a heap of tests around some custom controllers using Moq in VB. Up until now, I've not had to deal with VB Lambda shortcomings since I've only moqed properties or methods.

That is until this morning when I try also running integration tests using Cassini against my code. I had code to add headers using Response.Headers.Add. I did this so I could easily get the headers collection in unit tests using Moq(Of HttpResponseBase) and a SetupGet for Headers->NameValueCollection. Of course, the code chokes in anything other than IIS7 in Integrated Pipeline mode.

So, I changed my code to use Response.AddHeader, which means my unit tests fail. And since I'm in VB, I can' see a sane way to map the call to AddHeader to the Headers collection since Function() needs a return value in VB.

I see a few entries here about Moq and VB, but no one really has the problem of mapping Subs to something else in Moq.

Has anyone tackled this particular situation in VB using Moq?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

山人契 2024-08-12 00:12:36

啊。为什么你发帖后解决方案总是变得很明显。 :-)

这很丑陋,但它有效。

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

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

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

Ugh. Why do the solutions always become apparently AFTER you post. :-)

This is ugly, but it works.

  • Subclass HttpResponseBase.
  • Mock that and set the CallBase to True.

Then override Add/AppendHeader to do Headers.Add. Now you catch any variation people use in code as they all fall into Response.Headers collection. The realy code works regardless of which method you use.

Not as clean as just Moqing Add/Append in C# with callbacks, but it does work.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文