所以,我一直在互联网上搜索一下,试图看看是否有人在这里发明了轮子。我想要做的是编写一个集成测试,它将解析当前项目,查找对某个方法的所有引用,找到它的参数,然后检查数据库中的参数。例如:
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”],然后我可以检查数据库以确保我为这些描述符定义了行。此外,描述符是硬编码的。
我可以为所有描述符创建一个枚举值,但枚举将有数千种可能的选项,这看起来有点像黑客。
现在,SO:How I can get all reference with Reflection + C#上的这个链接基本上说没有一些非常先进的IL解析就不可能。澄清;我不需要Reflector或其他任何东西 - 它只是一个我可以运行的自动化测试,这样如果我团队中的任何其他开发人员检查调用此内容的代码而不创建数据库记录,则测试将失败。
这可能吗?如果是这样,是否有人有资源要查看或示例代码进行修改?
编辑:或许,也许是一种不同的方法来做这个VS试图找到所有引用?最终结果是我希望在记录不存在时测试失败。
答案 0 :(得分:1)
这将非常困难:您的程序可能会计算描述符的值,这意味着您的测试能够在不执行所述代码的情况下知道哪个值是可能的。
我建议您使用enum type更改此处的编程方式,或使用type safe enum pattern进行编码。这样,GetContentFor
的每次使用都是安全的:参数是枚举的一部分,语言类型检查器执行检查。
然后,您的测试可以轻松地迭代不同的枚举字段,并检查它们是否都在数据库中声明,非常容易。
添加新的内容密钥需要编辑枚举,但这可能会让您感到不方便,因为它有助于确保所有呼叫都安全的日志。