我想在单元测试中加载外部XML文件,以测试该XML上的一些处理代码.如何获取文件的路径?
通常在Web应用程序中我会这样做:
XDocument.Load(Server.MapPath("/myFile.xml"));
Run Code Online (Sandbox Code Playgroud)
但显然在我的单元测试中我没有引用Server或HttpContext,那么如何映射路径以便我不必指定完整路径?
更新:
我只想说明我实际测试的代码是针对XML解析器类的,类似于:
public static class CustomerXmlParser {
public static Customer ParseXml(XDocument xdoc) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
所以为了测试这个,我需要解析一个有效的XDocument.正在测试的方法不会访问文件系统本身.我可以直接在测试代码中从String创建XDocument,但我认为从文件加载它会更容易.
我是Mocking框架的新手,并已开始使用RhinoMocks来协助我的MVC App Unit Testing.
我正在使用Scott Hanselmanns MVC Mock Helper来协助模拟 HttpContext.我成功地(经过一段时间)嘲笑了我需要的一些东西,但是当谈到HttpContext的Application属性时,它已经失败了.
在我的应用程序中,我将一个对象存储在Application中,并在Controller中检索它,如:
SomeObj foo = (SomeObj)Application["fooKey"];
Run Code Online (Sandbox Code Playgroud)
这是在我的MVC应用程序中的Application_Start上创建的.
更新后的第一个答案(为清晰起见,附加代码)目前在测试设置中我做:
HttpContextBase mockHttpBase = mocks.FakeHttpContext();
controllerToTest = new SomeController();
mocks.SetFakeControllerContext(controllerToTest);
HttpApplicationStateBase appState =
MockRepository.GenerateStub<HttpApplicationStateBase>();
Globals tmpAppGlobals =
new Globals();
mockHttpBase.Expect(ctx => ctx.Application).Return(appState);
mockHttpBase.Expect(ctx => ctx.Application[Globals.GlobalsKey]).
Return(tmpAppGlobals);
Run Code Online (Sandbox Code Playgroud)
在我的单元测试设置中,我做:
Globals tmpAppGlobals = new Globals();
controllerToTest.ControllerContext.HttpContext.
Expect(ctx => ctx.Application[Globals.GlobalsKey]).
Return(tmpAppGlobals);
Run Code Online (Sandbox Code Playgroud)
此调用为Application对象抛出NullReference异常.
我的问题有两个:
1)这是正确的方法还是我从设计/架构的角度做错了什么?
2)为什么这不起作用?!
提前致谢.
我在Visual Studio 2010中的MVC4 Web API应用程序中使用XDocument,并且不确定测试策略.
我的大多数单元测试都使用内存中的XDocument,它适用于控制器,服务和存储库测试.
但是,我有XDocument.Load(filename)和XDocument.Save(filename)场景,我想测试(使用单元测试或集成测试).
我一直在寻找以下问题\回答关于所以在这里,但我不知道如何着手.
public class PathProvider
{
public virtual string GetPath()
{
return HttpContext.Current.Server.MapPath("App_Data/policies.xml")
}
}
PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());
Run Code Online (Sandbox Code Playgroud)
所以,我得到了我现在可以模拟调用XDocument.Load(pathProvider.GetPath())的任何调用.
我应该尝试测试PathProvider的工作原理吗?如果,那么,我将如何处理这个问题?
谢谢
戴维
asp.net-mvc ×1
c# ×1
httpcontext ×1
linq-to-xml ×1
mocking ×1
rhino-mocks ×1
tdd ×1
testing ×1