我需要为单元测试准备我的数据库,因此在设置方法中我想摆脱数据。
但是,除了单元测试 dll 之外,我不想成为其他任何人,以便能够DeleteAllData()
在我的数据访问层中调用我的方法。可以做什么?
我需要为单元测试准备我的数据库,因此在设置方法中我想摆脱数据。
但是,除了单元测试 dll 之外,我不想成为其他任何人,以便能够DeleteAllData()
在我的数据访问层中调用我的方法。可以做什么?
虽然其他人已经建议如何限制代码调用您的方法,但它们不会创建安全边界并且可以被欺骗(除非您签署两个程序集并验证证据)。
在你的业务逻辑中有一个名为 DeleteAllData 的方法对我来说听起来很可怕。如果仅在单元测试中使用此方法,我可能会将其移至单元测试程序集。如果那不可能,我至少会将代码放在编译器指令中,以便仅在调试模式下编译。
您可以对两个程序集进行签名,然后使用该InternalsVisibleTo
属性使单元测试程序集成为唯一能够看到internal
s 的程序集。您需要制作internal
您只想公开给单元测试项目的所有方法、属性和类。
MSDN 上InternalsVisibleToAttribute
:
指定通常仅在当前程序集中可见的类型对指定程序集可见。
您可能可以在方法中结合使用Assembly.GetCallingAssembly()和对调用堆栈的询问,DeleteAllData()
以确保您的方法仅由您期望的方法调用。
您可能需要防止抖动内联您的方法调用,以确保在调用程序集方法和调用堆栈到达您的DeleteAllData()
方法时保留它们。
调用堆栈可能就足够了,但可能还需要调用程序集。
我没有尝试过,但认为它应该在理论上有效。
internal
用关键字标记它。从MSDN 文档:
internal 关键字是类型和类型成员的访问修饰符。内部类型或成员只能在同一程序集中的文件中访问