1

我正在尝试围绕之前编写的一些代码编写一些测试,然后再开始使用它。我遇到了控制器方法引用 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 类且未设置它的测试一起运行,任何需要此测试的测试都会失败。为什么?

4

2 回答 2

3

也许我没有完全理解这个问题,但你为什么不能将 T4MVCHelpers.ProcessVirtualPath 设置为其他方法?

于 2011-09-30T00:53:01.307 回答
3

如果我在我的测试类的静态构造函数中设置 ProcessVirtualPath 委托,我就能让它工作。

 public class BaseTest
 {
    static BaseTest()
    {
        T4MVCHelpers.ProcessVirtualPath = s => s.TrimStart('~');
    }

    // TEST CODE

 }
于 2011-11-07T23:32:37.940 回答