我正在尝试围绕之前编写的一些代码编写一些测试,然后再开始使用它。我遇到了控制器方法引用 T4MVC 为图像和链接创建的一些静态变量的问题。这实际上与我之前的问题相同,但它不在构造函数中。
问题是这样的代码:
if (User.IsInRole("Rate Admin") || User.IsInRole("Administrator"))
{
_ratesViewData.ActionLinks = new List<CustomActionLink>
{
new CustomActionLink("Edit",
editPath + Resources.DelimeterHyphen,
Links.Content.Images.openwhite_gif),
new CustomActionLink("Delete",
statusPath + Resources.DelimeterHyphen,
Links.Content.Images.openwhite_gif)
};
}
问题是 Links.Content.Images.openwhite_gif,在 T4MVC 生成的代码中,它从静态方法 ProcessVirtualPath 调用 VirtualPathUtility.ToAbsolute。我似乎无法模拟 ProcessVirtualPath 或 VirtualPathUtility。
现在 ProcessVirtualPath 上方的评论说它是通过委托调用的,以允许将其替换以进行单元测试。代表是:
public static Func<string, string> ProcessVirtualPath = ProcessVirtualPathDefault;
如何替换为 ProcessVirtualPath 调用的内容以允许单元测试。我不在乎它是否真的有一条有效的路径,我只是不想让它爆炸。我可以从我的测试方法中做到这一点吗?没有更改代码来测试它是否在非测试项目中调试?
还有一个相关的问题是上面的一段代码的最佳实践是什么?哪里应该有基于权限的条件的代码?甚至是动作链接。我不确定他们为什么在 viewdata 模型中。
好的,我确实让它与评论中提到的代码一起工作。
T4MVCHelpers.ProcessVirtualPath = (s) => "~/Content/Images";
但仅当测试单独运行时,如果与另一个使用 TestControllerBuilder 类且未设置它的测试一起运行,任何需要此测试的测试都会失败。为什么?