2017-09-20 15 views
1

Xunit을 사용하여 SitecoreContext를 호출하는 메소드를 테스트하고 항상 null을 반환하는 유닛 테스트를 만들고 있습니다.Glassmapper SitecoreContext 단위 테스트

사이트 컨텍스트로 FakeDB를 사용하고 있습니다.

public static Model GetModelData(object owner) 
{ 
    try 
    { 
     using (var context = new SitecoreContext()) 
     { 
      string homePath = Sitecore.Context.Site.ContentStartPath; 
      Model = context.GetItem<Model>(string.Format("{0}/Configuration/Model", homePath)); 
     } 
    } 
    catch (Exception ex) 
    { 
     Sitecore.Diagnostics.Log.Error("GetModelData() Exception: " + ex.InnerException, owner); 
    } 
    return backToTop; 
} 

내가 FakeDb를 사용하여 가짜 SiteContext을 생성하는 방법을 촉구했습니다

는 단위 테스트 방법입니다. 내가 시도한 것은 다음과 같습니다.

var fakeSite = new Sitecore.FakeDb.Sites.FakeSiteContext(new Sitecore.Collections.StringDictionary 
    { 
     { "name", "fakesite" }, { "database", "master" }, { "rootPath", "/sitecore/content/home" } 
    }); 
    using (new Sitecore.Sites.SiteContextSwitcher(fakeSite)) 
    {  
     var result = SomeClass.GetModelData(this); 
     result.Should().NotBeNull(); 
    } 

디버깅 할 때 var 컨텍스트가 null을 반환합니다. Glassmapper SitecoreContext를 조롱하는 방법이 있습니까? 또는 메소드에서 새로운 SitecoreContext를 도입했기 때문에 이것이 불가능합니까?

답변

1

Db 인스턴스를 사용하여 코드를 래핑하십시오. 그런

뭔가 :

[TestCase] 
public void FooTest() 
{ 
    using (var db = new Db { }) 
    { 
     var fakeSite = new Sitecore.FakeDb.Sites.FakeSiteContext(new Sitecore.Collections.StringDictionary 
     { 
      { "name", "website" }, { "database", "web" } 
     }); 
     using (new Sitecore.Sites.SiteContextSwitcher(fakeSite)) 
     { 
      Sitecore.Context.Site.Name.Should().Be("website"); 
      Sitecore.Context.Site.Database.Name.Should().Be("web"); 
     } 
    } 
} 
여기에 테스트 정확히 무엇
3

? FakeDB? Sitecore? 단위 테스트가 Glass를 운동하도록 설계된 것 같습니다. 실제 논리는 행사되지 않으며 가정 사항은 문서화되지 않습니다.

또한 5 줄의 코드에만 많은 의존성이 있으므로 테스트하기가 어렵지 않습니다. 단위 테스트는 단지 코드에 테스트를 집중할 때 훨씬 쉽습니다. Sitecore, Glass 및 FakeDB에 대한 단위 테스트를 작성할 필요가 없습니다. 이것이 귀하의 직업이 아닙니다. 종속성 (유리 컨텍스트, 시작 경로 및 진단 로거)이 정상적으로 ctor에 대한 처리 - 인수에 대한 입력이되도록이 코드를 다시 구성해야합니다. 이렇게하면 통계를 사용하여 상속 한 암시 적 동작에 의존하는 대신 테스트중인 코드의 매개 변수를 제어 할 수 있습니다. 의심 할 여지없이 HttpContext에 의존하는 Glass 내에 묻혀있는 코드가 있으므로 제대로 작동하지 않는 것입니다. 이것이 작동하지 않는 이유입니다. 정적 멤버에 대한 호출을 제거하고 대신이 값을 코드에 전달하면 코드가 테스트 중일 때이를 쉽게 조롱 할 수 있으며 이런 종류의 문제는 전혀 발생하지 않습니다.

위 테스트 글이으로 낭비되고 있기 때문에 완전히 단원 테스트 전략을 다시 생각해 보시기 바랍니다.