2016-08-13 1 views
1

Я обнаружил странную аномалию с экземпляром класса NSubstitute. Работа с Sitecore 8,1 обновление 3 Sitecore.Kernell.dll, следующий тест пройден:Создание базы данных Sitecore с NSubstitute допускается, несмотря на внутренний конструктор

[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?

ответ

2

Пространство имен NSubstitute отмечено InternalsVisibleTo в Sitecore.Kernel.

What is the DynamicProxyGenAssembly2 assembly?

От Sitecore.Kernel: [сборка: InternalsVisibleTo ("DynamicProxyGenAssembly2")]

+0

Bam, это было быстро. : D –

+0

Ха-ха. Только потому, что я изучал Sitecore.Kernel атрибуты близко, совсем недавно ;-) –

+0

Конечно, это означает, что Evil Implementer может выполнить конечный запуск вокруг конструктора и использовать SubstituteForPartsOf для создания собственных БД. ;) –

Смежные вопросы