我正在尝试围绕之前编写的一些代码编写一些测试,然后再开始使用它。我遇到的问题是控制器方法引用了T4MVC为图像和链接制作的一些静态变量。它实际上是与我之前的问题here相同的问题,但它不在构造函数中。
问题是这样的代码:
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";
BUT 只有在单独运行测试时,如果使用另一个使用TestControllerBuilder类并且未设置它的测试运行,则任何需要此测试的测试都将失败。为什么?
答案 0 :(得分:3)
也许我没有完全理解这个问题,但为什么不能将T4MVCHelpers.ProcessVirtualPath设置为其他方法呢?
答案 1 :(得分:2)
如果我在测试类的静态构造函数中设置ProcessVirtualPath委托,我能够使用它。
public class BaseTest
{
static BaseTest()
{
T4MVCHelpers.ProcessVirtualPath = s => s.TrimStart('~');
}
// TEST CODE
}