1

我需要为单元测试准备我的数据库,因此在设置方法中我想摆脱数据。

但是,除了单元测试 dll 之外,我不想成为其他任何人,以便能够DeleteAllData()在我的数据访问层中调用我的方法。可以做什么?

4

5 回答 5

3

虽然其他人已经建议如何限制代码调用您的方法,但它们不会创建安全边界并且可以被欺骗(除非您签署两个程序集并验证证据)。

在你的业务逻辑中有一个名为 DeleteAllData 的方法对我来说听起来很可怕。如果仅在单元测试中使用此方法,我可能会将其移至单元测试程序集。如果那不可能,我至少会将代码放在编译器指令中,以便仅在调试模式下编译。

于 2015-01-12T17:00:34.487 回答
1

您可以对两个程序集进行签名,然后使用该InternalsVisibleTo属性使单元测试程序集成为唯一能够看到internals 的程序集。您需要制作internal您只想公开给单元测试项目的所有方法、属性和类。

MSDN 上InternalsVisibleToAttribute

指定通常仅在当前程序集中可见的类型对指定程序集可见。

于 2015-01-12T15:39:08.147 回答
1

您可能可以在方法中结合使用Assembly.GetCallingAssembly()和对调用堆栈的询问,DeleteAllData()以确保您的方法仅由您期望的方法调用。

您可能需要防止抖动内联您的方法调用,以确保在调用程序集方法和调用堆栈到达您的DeleteAllData()方法时保留它们。

调用堆栈可能就足够了,但可能还需要调用程序集。

我没有尝试过,但认为它应该在理论上有效。

于 2015-01-12T16:38:48.147 回答
0

internal用关键字标记它。从MSDN 文档

internal 关键字是类型和类型成员的访问修饰符。内部类型或成员只能在同一程序集中的文件中访问

于 2015-01-12T15:39:37.673 回答
0

我还有另一种方法来实现问题中提到的事情。

如果您正在使用 VSTS 单元测试。

将该方法设置为类中的私有方法,以便其他类和程序集无法访问该方法。

现在要从单元测试中调用该私有方法,请使用 PrivateObject

这是 PrivateObject 的 Microsoft 文档:-链接

如何使用私有对象:-链接

于 2015-01-13T04:28:37.260 回答