首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moq context.server.transfer

Moq context.server.transfer
EN

Stack Overflow用户
提问于 2012-02-29 19:49:42
回答 1查看 280关注 0票数 1

对于单元测试,我使用moq来模拟附加到HttpContextBase的HttpServerUtilityBase。这是为了让被测函数能够调用context.server (ASP.Net)。

然而,当被测试的方法执行context.server.transfer时,当在应用程序中完成时,这会导致函数(在httphandler中调用)停止执行。在我的moq版本中,执行"transfer“调用,然后继续执行。

为了解决这个问题,我在传输之后放入了返回语句,但是样式转换正确地将它们识别为多余的语句。

我可以设置我的Mock来强制调用方法返回吗?

例如,如果我们正在测试这样的方法:

代码语言:javascript
复制
public void ProcessRequest(HttpContextBase context, string username, Logger logger)
{
    if (string.isNullOrEmpty(username))
    {
        logger.Warn("Blah Blah invalid username");
        context.Server.Transfer("~/ErrorPage.aspx");
    }
    ETC...
}

下面的代码将正确地测试对无效用户名执行的正确操作。

代码语言:javascript
复制
[TestMethod]
public void ProcessRequestTest()
{
    // Set up my mocks
    var logger = new Mock<ILogger>();
    logger.Setup(l => l.Warn(It.IsAny<string>());
    var context = new Mock<HttpContextBase>();
    var server = new Mock<HttpServerUtilityBase>();
    context.Setup(c => c.Server).Returns(server.Object);

    // Try an invalid call
    var rh = new MyRequestHandler();
    rh.ProcessRequest(context.Object, string.empty, logger.Object);

    // Check that the message was logged and the transfer was made
    logger.Verify(l => l.Warn(It.IsRegex("invalid username"));
    server.Verify(s => s.Transfer(It.IsAny<string>()));
}

但是,因为context.Server是模拟的,所以传输不会停止ProcessRequest的执行,除非我在传输后放入一个返回,否则测试将在"ETC...“之后执行。区块。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-03 00:51:38

这是相当棘手的,这也是为什么通常不推荐模拟你不拥有的对象的原因。一种解决方案是抛出一个异常(我认为在ASP.NET代码中就是这样做的)。有关“重定向后停止执行”部分的示例,请参阅此link

所以就像这样:

代码语言:javascript
复制
server.Setup(s => s.Transfer(It.IsAny<string>()).Throws<TransferException>();

然后用NUnit的Assert.Throws捕捉它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9498588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档