创建一个具有内部修饰符的测试类,使其对单元测试框架可见。

3

我有一个单元测试类,如下所示:

[TestClass]
internal class AttractionRepositoryUnitTest : 
             RepositoryBaseTest<AttractionRepository, Attraction, AttractionFakeRepository>
{
    //Code here
}

由于 internal 修饰符,这个类中的测试无法被找到。为了使其可见,RepositoryBaseTest 中的其中一个类必须变成 public,但这是不可取的。为了避免这种情况,我需要进行一些重构,这需要花费一些时间。是否有可能在不修改可见性的情况下让这个测试类对单元测试可见?

测试类是一个内部类。


我不认为这是重复的,@ErikE - 从源代码示例中可以看出,测试类是内部类。 - Rui Jarimba
2
解决方案A:将单元测试类从internal更改为public。老实说,为什么这是不可取的呢?解决方案B:使用支持internal类的单元测试框架,例如NUnit。 - Rui Jarimba
@RuiJarimba 因为 RepositoryBase 被定义为 RepositoryBaseTest<T, Y, Z>,而 T 是 internal 的,所以我必须在这个测试中加上 internal。唯一的解决方案是将 AttractionRepository 改为 public,但这是不可取的,我想避免这种情况。我可以重构 RepositoryBaseTest<T, Y, Z> 来“隐藏”T类,但这需要花费我几个小时,我也想避免这种情况。 - Ricardo Alves
好的,我现在明白你的问题了。我之前认为AttractionRepositoryUnitTest是唯一的内部类。是的,你可能需要使用InternalsVisibleToAttribute - Rui Jarimba
1
@RicardoAlves,了解T是什么以及为什么它必须是内部的将会非常有趣。单元测试项目中可能存在哪些内部单元测试问题?你的测试确实与它们所测试的代码位于不同的项目中,对吗? - ErikE
显示剩余4条评论
2个回答

3

我应该将它显示在哪个程序集中?我想我已经尝试了每一个 Microsoft 程序集。 - Ricardo Alves
@Jay 从源代码示例中可以看出,测试类是内部的。 - Rui Jarimba
如果您无法向源代码添加属性,则需要使用反射。更新的答案。 - Jay
@Jay,你确定那会有帮助吗?他的问题是单元测试框架无法找到测试,因为测试类被标记为内部。请注意,他并不是在尝试对不同程序集中的内部类进行单元测试。 - Rui Jarimba
是的,您需要将内部内容暴露给单元测试程序集...我不知道为什么这很重要,但这就是答案。您可能还需要为主入口程序集添加第二个属性,因此请添加2个“internals visible yo”属性。 - Jay

1
假设 RepositoryBaseTest 的所有类型参数都实现了某个接口,您可以提供这些接口的公共实现,这些实现将包装内部实现:
public AttractionRepositoryTestWrapper : IAttractionRepository
{
    private AttractionRepository _attractionRepositoryImpl;

    // forward all calls to _attractionRepositoryImpl
}

如果需要,其他内部也是同样的处理方式。接下来可以将RepositoryBaseTest变为公共的,因此AttractionRepositoryUnitTest也是公共的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接