2016-08-13 4 views
1

NSubstitute 클래스 인스턴스화로 이상한 예외가 있음을 발견했습니다. Sitecore 8.1 업데이트 3 Sitecore.Kernell.dll 작업, 다음 테스트에 통과 :내부 생성자에도 불구하고 NSubstitute를 사용하여 Sitecore 데이터베이스 만들기

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

이를 Sitecore.Data.Database 만 내부 생성자가 있다는 사실에도 불구하고 :

internal Database(string name) 
{.... 

NSubstitute에 대한 정상적인 동작이 아닌 것으로 확인되었습니다.

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"); 
     } 
    } 
} 

,

:이 코드 프로젝트 "ExternalLibrary"를 생성
System.NotSupportedException: Parent does not have a default constructor. The default constructor must be explicitly defined. 

Sitecore.Data.Database 클래스에서이 오류가 발생하지 않는 이유는 무엇입니까?

답변

2

NSubstitute 네임 스페이스는 Sitecore.Kernel의 InternalsVisibleTo로 표시됩니다.

Sitecore.Kernel 가입일

What is the DynamicProxyGenAssembly2 assembly?

[조립체 InternalsVisibleTo ("DynamicProxyGenAssembly2")]

+0

빵, 즉 빨랐다. : D –

+0

하하. 단지 내가 Sitecore.Kernel 속성을 아주 가깝게 연구했기 때문에, 아주 최근에 ;-) –

+0

물론 이것은 Evil Implementer가 생성자에 대해 end-run을 수행 할 수 있고 SubstituteForPartsOf를 사용하여 자신의 DB를 만들 수 있음을 의미합니다. ;) –