【发布时间】:2014-12-10 21:17:33
【问题描述】:
在 this link 中解释了为什么您不想使用 async void 方法和 UnitTest 来跟踪它们并避免它们。使用reflection 在所有方法中扫描async void,所有这些都可以完美运行。
因为我们最近有一个错误,我们想创建一个类似的方法,它将检查解决方案中是否有任何方法包含Task#.Result 调用。不幸的是,我们不能以字符串的形式访问方法的主体并查看它是否包含".Result;" 或类似的东西。大多数人可能都知道,reflection 使用metadata。因此我们可以获取属性、方法、方法的变量类型等,但没有任何实质性内容,例如方法的变量名称或方法本身的代码。
我知道我可以从方法中以字节数组的形式访问MSIL,我还可以将它们转换为十六进制数据(例如使用this link 中的代码)。 MSIL 被外部库用于再次生成可编译和可运行的 C# 代码(即使在运行时),但问题是您无法读取 MSIL。
那么,有没有人知道如何编写 UnitTest 来检查解决方案中的所有方法,并检查他们是否在任务上调用了 get-property .Result。如果解决方案中存在这些方法中的任何一种,则 UnitTest 应该失败,否则它会成功。 (最好给出包含此调用的方法,但这不是优先事项。如果我们知道它失败了,我们可以在需要时搜索自己调用它的方法。)
我们想要避免Task#.Result 的原因是我们遇到了死锁。类似于this SO-post。
【问题讨论】:
-
这听起来更像是静态分析而不是单元测试。
标签: c# unit-testing reflection methods task