【问题标题】:Trying to stub Server.MapPath with MvcContrib Test helpers and Rhino Mocks 3.5尝试使用 MvcContrib 测试助手和 Rhino Mocks 3.5 存根 Server.MapPath
【发布时间】:2010-12-07 03:09:56
【问题描述】:

我正在使用 MvcContrib 的测试助手和 Rhino Mocks 3.5 来测试 ASP.NET MVC 操作方法。我像这样构建我的假控制器:

var _builder = new TestControllerBuilder();
_builder.InitializeController(_controller);

所以我得到了一个包含假 HTTP 服务器等的假控制器。

然后我尝试像这样对 Server.MapPath 方法进行存根

controller.Server.Stub(x => x.MapPath(Arg<string>.Is.Anything)).Return("/APP_DATA/Files/");

但在我的测试方法中,对 Server.MapPath("/APP_DATA/Files/") 的调用返回 null。

这是测试

    const string STOCK_NUMBER_ID = "1";
    const string FULL_FILE_PATH = "App-Data/Files";

    var controller = CreateStockController();
    _uploadedFileTransformer.Stub(x => x.ImageBytes).Return(new byte[10]);
    _uploadedFileTransformer.Stub(x => x.ConvertFileToBytes(FULL_FILE_PATH)).Return(true);

    controller.Server.Stub(x => x.MapPath(Arg<string>.Is.Anything)).Return("/App_Data/Files/");

    controller.AddImage(Guid.NewGuid(), STOCK_NUMBER_ID);

我错过了什么?

【问题讨论】:

  • 我们可以看看测试吗?看起来可能缺少 repository.Playback()。
  • 我已将测试添加到 OP。我认为我们不需要在 Rhino Mocks v3.5 中使用录制和播放功能 - 我错了吗?
  • 你也可以粘贴CreateStockController()吗?我不熟悉您使用的测试助手,但是 controller.Server 是在哪里创建的?
  • 好点,事实上,经过进一步调查,我发现它没有被创建。我将如何创建它并作为我的假控制器的一部分出现?可能吗?我想知道为什么 MvcContrib Testhelpers 还没有这样做。
  • 录制/播放不是必需的,但有些人仍然使用它。他们经常做一个记录(),但忘记执行回放()并且他们的存根/模拟不起作用。但是,我刚刚使用 MVCContrib 对示例 MVC 项目进行了测试,我看到了同样的情况——controller.Server 是 Rhino.Mocks 代理,但 MapPath 存根不起作用。我要去玩一玩,看看发生了什么。

标签: rhino-mocks mvccontrib-testhelper


【解决方案1】:

旧帖子,但我正在寻找这个,我找到了一个解决方案,MvcContrib 的 TestHelper 可能已经修复了它,因为对我来说它正在工作。

_builder.HttpContext.Server.Stub(s => s.MapPath("~/" + filepath)).Repeat.Once().Return(mapedPath);

【讨论】:

    【解决方案2】:

    看起来这是 MVCContrib 中的一个错误(至少在我的机器上 - v1.0.0.0)。设置控制器上下文时,它使用 Rhino.Mocks 记录/重放模式,但是(这是错误),它不会将 HttpServer 模拟置于重放模式。它将其他所有内容置于重播模式,但不是那个。

    所以快速解决方法是:

    controller.Server.Replay();
    

    作为测试“安排”部分的一部分。然后就可以正常使用了。

    【讨论】:

    • Patrick,我尝试了你的建议,我添加了 controller.Server.Replay() 但我仍然遇到同样的问题。我将 MvcContrib v2.0.36.0 与 MVC2 一起使用。我似乎对这个问题有好多年了,所以最后我在我的操作方法中添加了一个 HTTPServerUtilityBase 参数,并创建了一个自定义模型绑定器,它为我提供了一个服务器对象。然后在我的测试中,我创建了自己的 HttpServerUtilityBase 存根,并存根了 MapPath 方法。这一切都很好,但我更希望 TestHelper 首先为我提供正确的存根。
    • 好的。我尝试过的示例项目是 MVC1。看起来该错误仍然存​​在于 MVC2 中。应该很容易从 CodePlex 分叉代码,修复和提交。很高兴你成功了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多