我正试图通过单元测试追溯一些遗留代码。对单元测试不是很有经验,这并不让我开心:)
有问题的代码是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而不是两者都使用?
干杯, 马特
答案 0 :(得分:0)
这不能直接回答你的问题,但我认为你应该尝试使用MVC Contrib的TestControllerBuilder来进行这种测试。它处理控制器的许多依赖关系,让您专注于需要测试的位。