尽管内部构造函数不允许使用NSubstitute创建Sitecore数据库

尽管内部构造函数不允许使用NSubstitute创建Sitecore数据库,sitecore,nsubstitute,Sitecore,Nsubstitute,我发现NSubstitute类实例化有一个奇怪的异常。使用Sitecore 8.1 update 3 Sitecore.Kernell.dll,以下测试通过: [事实] 公共无效CanCreateSubstituteDatabase() { 数据库db=替换为(“子”); db.Should().NotBeNull(); } 尽管Sitecore.Data.Database只有一个内部构造函数,但仍然存在此问题: 内部数据库(字符串名称) {.... 我已确认这不是NSubstitute的正

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

[事实]
公共无效CanCreateSubstituteDatabase()
{
数据库db=替换为(“子”);
db.Should().NotBeNull();
}
尽管Sitecore.Data.Database只有一个内部构造函数,但仍然存在此问题:

内部数据库(字符串名称)
{....
我已确认这不是NSubstitute的正常行为。我使用以下代码创建了一个项目“ExternalLibrary”:

命名空间外部库
{
公开课Foo
{
内部Foo(字符串条)
{
巴=巴;
}
公共字符串栏{get;}
}
}
当我尝试使用NSubstitute在一个单独的库中实例化它时

命名空间NSubClassInstantiation
{
使用外部图书馆;
使用FluentAssertions;
使用替代品;
使用Xunit;
公务舱
{
[事实]
公共无效CANISTATE()
{
var foo=替代(“baz”);
foo.Bar.Should().Be(“baz”);
}
}
}
测试按预期失败,出现以下异常:

System.NotSupportedException:父级没有默认构造函数。必须显式定义默认构造函数。

为什么Sitecore.Data.Database类不会引发此错误?

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


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

Bam,这很快。DHaha。这仅仅是因为我最近一直在仔细研究Sitecore.Kernel属性;-)当然,这意味着一个邪恶的实现者可以在构造函数周围运行一段时间,并使用替换部分来创建自己的DBs。;)我将测试项目命名为“Sitecore.IntegrationTests”在过去;-)至于邪恶-如何:双击DotPeek或ReSharper AssemblyExplorer中的程序集显示程序集属性,包括上面包含的线标记。请参阅