2

所以,我一直在互联网上搜索了一下,想看看是否有人已经在这里发明了轮子。我想做的是编写一个集成测试来解析当前项目,找到对某个方法的所有引用,找到它的参数,然后检查数据库中的那个参数。例如:

public interface IContentProvider
{
     ContentItem GetContentFor(string descriptor);
}

public class ContentProvider : IContentProvider
{
    public virtual ContentItem GetContentFor(string descriptor)
    {
        // Fetches Content from Database for descriptor and returns in
    }
}

任何其他类都将使用 IOC 将 IContentProvider 注入到其构造函数中,这样他们就可以编写如下内容:

contentProvider.GetContentFor("SomeDescriptor");
contentProvider.GetContentFor("SomeOtherDescriptor");

基本上,单元测试会找到所有这些引用,找到文本集 ["SomeDescriptor", "SomeOtherDescriptor"],然后我可以检查数据库以确保为这些描述符定义了行。此外,描述符是硬编码的。

我可以为所有描述符创建一个枚举值,但枚举会有数千个可能的选项,这看起来有点像 hack。

现在,这个关于 SO 的链接:How I can get all reference with Reflection + C#基本上说,如果没有一些非常高级的 IL 解析,这是不可能的。澄清; 我不需要 Reflector 或任何东西——它只是作为一个我可以运行的自动化测试,这样如果我团队中的任何其他开发人员在没有创建数据库记录的情况下签入调用此内容的代码,测试就会失败。

这可能吗?如果是这样,是否有人可以查看资源或修改示例代码?

编辑:或者,也许是一种不同的方法来做这个 VS 试图找到所有的引用?最终结果是我希望在记录不存在时测试失败。

4

1 回答 1

1

This will be very difficult: your program may compute the value of the descriptor, which will mean your test is able to know which value are possible without executing said code.

I would suggest to change the way you program here, by using an enum type, or coding using the type safe enum pattern. This way, each and every use of a GetContentFor will be safe: the argument is part of the enum, and the languages type checker performs the check.

Your test can then easily iterate on the different enum fields, and check they are all declared in your database, very easily.

Adding a new content key requires editing the enum, but this is a small inconvenient you can live with, as it help a log ensuring all calls are safe.

于 2011-03-29T17:22:03.857 回答