单元测试遗留代码 - 重构什么以适应Rhino Mocks上下文?

时间:2010-12-22 15:23:57

标签: .net unit-testing rhino-mocks

我正试图通过单元测试追溯一些遗留代码。对单元测试不是很有经验,这并不让我开心:)

有问题的代码是MVC控制器。我重新考虑它去除直接依赖关系并用接口取而代之,这些接口都很好而且直截了当。但是,为了进行测试,我很难让所有的上下文模拟正确。

许多代码都调用Request.QueryString和Request.Params。我不完全确定为什么它会单独对待这两个,但我不愿意摆弄任何我实际上并不需要改变的东西。

所以我把它放在一起初始化一个模拟的上下文:

        var controller = new TestController();

        var request = MockRepository.GenerateMock<HttpRequestBase>();
        var context = MockRepository.GenerateMock<HttpContextBase>();

        var collection = new System.Collections.Specialized.NameValueCollection();   
        collection.Add("Id", "1");   

        context.Expect( c => c.Request ).Return( request ).Repeat.Any();
        request.Expect( r => r.Params ).Return( collection ).Repeat.Any();
        request.Expect( x => x.QueryString["foo"] ).Return("bar").Repeat.Any();

        controller.ControllerContext = new ControllerContext(context, new RouteData(), controller);

“TestController”只是一个继承自正在测试的控制器的本地类。上面的代码非常愉快地编译,但是当我尝试运行它时,我收到以下错误:

 Previous method 'HttpRequestBase.get_QueryString();' requires a return value or an exception to throw.

谷歌搜索这似乎并不是非常有用。

问题是,我在这里重构了什么:我的测试是为了尝试让它构建,还是我的基本代码以便它只使用Params或QueryString而不是两者都使用?

干杯, 马特

1 个答案:

答案 0 :(得分:0)

这不能直接回答你的问题,但我认为你应该尝试使用MVC Contrib的TestControllerBuilder来进行这种测试。它处理控制器的许多依赖关系,让您专注于需要测试的位。