使用 NUnit 出现不一致的可访问性错误但仅使用 MSTest 编译正常?

Inconsistent accessibility error using NUnit but compiles fine using only MSTest?

注意:我检查了“提问”页面显示的前两页搜索结果,但 none 解决了我所拥有的 issue/question。


更新:一夜好眠后重启 VS,不一致问题消失了...

用之前没有报错的代码回到提交,甚至删除了bin和obj文件夹,现在当然尽职尽责地不断报错,我只能让它消失通过更改代码 - 应该是这样。

这让我既 :D 又 :(

我不喜欢这种前后矛盾的行为!


为什么使用 MSTest 可以正常编译的代码突然抛出

Error 1 Inconsistent accessibility: return type 
  'ActualProject.ClassHierarchy.BaseJointer' is less accessible than method
  'TestProject.ClassHierarchy.BaseJointer_Tests.MakeJointer()'

何时将 NUnit 添加到组合中?

即"less accessible"的class:

class BaseJointer
{
    public DoveTailJoint MakeDoveTailJoint(
        PieceOfWood woodTails, PieceOfWood woodPins) 
    { return null; }
}

比方法:

[TestClass]
public class BaseJointer_Tests
{
    protected virtual BaseJointer MakeJointer()
    {
        return new BaseJointer();
    }
}

当 none 个项目引用 NUnit 时不会发生错误。

错误确实发生在两种情况下:

  1. 当解决方案中有两个项目时:ActualProjectTestProjectTestProject 已引用 MSTest。将对 NUnit 的引用添加到 TestProject.
  2. 时发生错误
  3. 当解决方案中有三个项目时:ActualProjectTestProject 仅引用 MSTest 和 NUnitTestProject 仅引用 NUnit。

第二个让我特别困惑,因为它在根本不引用 NUnit 的 TestProject(的代码)上产生错误。

仅供参考:ActualProject 已 InternalsVisibleTo 设置为 TestProject 和 NUnitTestProject

为什么仅通过添加对 NUnit 测试框架的引用,internal 就变得不如 protected 可见?

尝试制作 BaseJointer class public.

我能够在不需要 NUnit 的情况下重现错误。两个项目,一个用BaseJointer,另一个用BaseJointer_Tests,另一个用class。第二个项目引用 MSTest 和第一个项目。第一个项目有一个 assembly: InternalsVisibleTo("secondAssembly")(检查它是否正确,因为如果我删除它,我会收到第三个错误)。

现在,我会说这是合乎逻辑的:如果您创建第三个程序集,并且 subclass BaseJointer_Tests 您将可以访问 BaseJointer 而无需 InternalsVisibleTo.

The error does not occur when none of the projects references NUnit.

我认为这是不正确的。

这个错误应该总是发生。 (return) 类型至少应与方法 (member) 一样易于访问。

在可访问性级别的偏序中,internalprotected 这两个级别不可相互比较。无法看到 protected 成员的人(同一项目中的非派生类型)可以看到 internal 成员。 protected 成员可以被无法看到 internal 成员的人(在不同项目中派生类型)看到。

所以 internal 不是 "as least as accessible as" protected。因此,编译时错误是正确且必需的。

Why would internal become less visible than protected by sole virtue of adding a reference to the NUnit test framework?

不应该。您确定在添加项目引用之前强制编译了所有项目吗?也许在您对它做了一些(不相关的)操作之前,该项目没有被重新编译?