尽管有内部构造函数,但仍允许使用 NSubstitute 创建 Sitecore 数据库

Creating a Sitecore Database with NSubstitute allowed despite internal constructor

我发现 NSubstitute class 实例化有一个奇怪的异常。使用 Sitecore 8.1 更新 3 Sitecore.Kernell.dll,以下测试通过:

[Fact]
public void CanCreateSubstituteDatabase()
{
  Database db = Substitute.For<Sitecore.Data.Database>("sub");
  db.Should().NotBeNull();
}

尽管 Sitecore.Data.Database 只有一个内部构造函数:

 internal Database(string name)
 {....

我已经确认这不是 NSubstitute 的正常行为。我使用以下代码创建了一个项目 "ExternalLibrary":

namespace ExternalLibrary
{
    public class Foo
    {
        internal Foo(string bar)
        {
            Bar = bar;
        }

        public string Bar { get; }
    }
}

当我尝试使用 NSubstitute 在单独的库中实例化它时,

namespace NSubClassInstantiation
{
    using ExternalLibrary;
    using FluentAssertions;
    using NSubstitute;
    using Xunit;

    public class FooTest
    {
        [Fact]
        public void CanInstantiate()
        {
            var foo = Substitute.For<Foo>("baz");

            foo.Bar.Should().Be("baz");
        }
    }
}

测试按预期失败,但出现以下异常,

System.NotSupportedException: Parent does not have a default constructor. The default constructor must be explicitly defined.

为什么 Sitecore.Data.Database class 没有抛出这个错误?

NSubstitute 命名空间在 Sitecore.Kernel 中标记为 InternalsVisibleTo。

What is the DynamicProxyGenAssembly2 assembly?

来自 Sitecore.Kernel:[程序集:InternalsVisibleTo("DynamicProxyGenAssembly2")]