我需要准备我的数据库进行单元测试,因此在设置方法中我想摆脱数据。
但是,我不想成为其他任何人,但单元测试dll能够调用我的数据访问层中的DeleteAllData()
方法。可以做些什么?
答案 0 :(得分:3)
虽然其他人已经建议如何限制代码调用您的方法,但它们不会创建安全边界并且可能被欺骗(除非您对两个程序集进行签名并验证证据)。
在您的业务逻辑中使用名为DeleteAllData的方法对我来说听起来很可怕。如果此方法仅用于单元测试,我可能会将其移至单元测试组件。如果那是不可能的,我至少会把代码放在compiler directive中,只能在调试模式下编译。
答案 1 :(得分:1)
您可以对两个程序集进行签名,然后使用InternalsVisibleTo
属性使单元测试程序集成为唯一能够查看internal
的程序集。您需要创建您只想公开给单元测试项目的所有方法,属性和类internal
。
InternalsVisibleToAttribute
上的MSDN:
指定仅在当前程序集中通常可见的类型对指定程序集可见。
答案 2 :(得分:1)
您可以在DeleteAllData()
方法中使用Assembly.GetCallingAssembly()和interrogation of the call stack的组合,以确保您的方法仅由您期望的方法调用。
您可能需要prevent the jitter inlining your method calls以确保在访问DeleteAllData()
方法时保留调用汇编方法和调用堆栈。
调用堆栈可能已足够,但也可能需要调用程序集。
我没试过这个,但认为它应该在理论上有用。
答案 3 :(得分:0)
使用internal
关键字标记。来自MSDN docs:
internal关键字是类型和类型成员的访问修饰符。内部类型或成员只能在同一程序集中的文件中访问
答案 4 :(得分:0)