UnitTest检查解决方案中的方法是否包含方法调用

时间:2014-12-10 12:29:34

标签: c# unit-testing reflection methods task

this link中解释了为什么您不希望使用async void方法和UnitTest来跟踪它们并避免它们。所有这些都可以完美地使用reflection来扫描所有方法中的async void

因为我们最近有一个错误,我们想要创建一个类似的方法,它将检查解决方案中是否有任何包含Task#.Result调用的方法。遗憾的是,我们无法将方法的主体作为字符串访问,并查看它是否包含".Result;"或类似内容。正如大多数人可能知道的那样,reflection使用metadata。所以我们可以得到属性,方法,方法的变量类型等,但没有实质内容,比如方法本身的方法变量名或代码。

我知道我可以从方法中作为字节aray访问MSIL,我也可以将它们转换为十六进制数据(例如使用this link中的代码)。外部库使用MSIL来再次生成可编译和可运行的C#代码(即使在运行时),但问题是您无法阅读MSIL

那么,是否有人知道编写UnitTest的方法,该方法检查解决方案中的所有方法并检查它们是否在Task上调用get-property .Result。如果解决方案中存在任何这些方法,则UnitTest应该失败,否则它将成功。 (最好给出哪些方法包含此调用,但这不是优先级。如果我们知道它失败,我们可以搜索自己在需要时调用它的方法。)

我们想避免Task#.Result的原因是因为我们遇到了僵局。与this SO-post类似。

1 个答案:

答案 0 :(得分:2)

您可以尝试为FxCop编写自定义规则,而不是编写单元测试。您似乎可以使用Method.Instructions集合(FxCop对象模型)来查找对Task<> .Result的所有调用。

本文展示了类似检查的示例实现:http://www.codeproject.com/Articles/30666/Steps-to-Write-Your-Own-Custom-Rule-using-FXCOP