2013-12-16 2 views
1

테스트 할 수없는 설정 제공자 (회사 레거시 코드)가 있습니다. 설정 저장소에 설정 공급자를 래핑하여 테스트 할 수없는 코드의 양을 줄이려고합니다. 따라서 Settings 공급자를 사용하는 20 가지 방법 대신, 대신 1 가지 방법을 사용할 것입니다. 나머지는 SettingsRepository 인터페이스를 구현합니다.클래스 내 스텁/모의 2 레벨

나중에 테스트를하는 데 어려움을 겪고 있습니다. 일반적으로 잘못된 것을 나타냅니다.

나는 무엇을 찾을 수 있기를 바랍니다.

public class SettingsRepository : ISettingsRepository 
{ 
    public SettingsRepository() {Settings = Settings.Default; } 
    public Settings Settings { get; set; } 
} 

public interface ISettingsRepository 
{ 
    Settings Settings { get; set; } 
} 

저장소를 삽입하는 데 단일성을 사용합니다. 저장소에서 뭔가를 얻는 방법은 다음과 같습니다.

_settingsRepository.Settings.SecureCache 

그래서 여기에 문제가 있습니다. 을 사용하여 SettingsRepository 인터페이스를 모의하거나 스터핑 할 수는 있지만 실제로해야 할 일은 "설정"을 모의 해 SecureCache를 반환하는 것입니다.

내가 좋아하는 뭔가를 할 수 nsubstitute에서 "깊은 모의"할 수 있도록하는 방법이 있나요 :

현재
_settingsRepository.Settings.SecureCache.Returns("www.somepath.com"); 

"설정이"null로, 나는이 조롱 수있는 일이 없습니다.

내 대체 솔루션은 SettingsRepository에 직접 모든 설정 필드를 추가하는 것이지만 솔루션의 다른 곳에서 테스트 할 수없는 코드를 옮길 것이므로이를 피하고 싶습니다.

답변

1

NSubstitue (버전 1.5.0.0)를 사용하면 다음과 같이 할 수 있습니다. 설정의 인스턴스를 만들거나 가짜 인스턴스를 만들 수도 있습니다. 그런 다음 아래와 같이 가짜 SecureCache를 반환 할 수 있습니다.

public class SettingsRepository : ISettingsRepository { 
    public SettingsRepository() { Settings = Settings.Default; } 
    public Settings Settings { get; set; } 
} 

public interface ISettingsRepository { 
    Settings Settings { get; set; } 
} 

public class Settings { 
    public Settings Default { get; set; } 
    public string SecureCache { get; set; } 
} 

[TestFixture] 
public class TestClass 
{ 
    [Test] 
    public void Subject_Scenario_Expectation() 
    { 
     var repoStub = Substitute.For<ISettingsRepository>(); 
     repoStub.Settings.Returns(new Settings() { SecureCache = "www.somepath.com" }); 

     Assert.IsNotNull(repoStub.Settings); 
     Assert.IsNotNull(repoStub.Settings.SecureCache); 
    } 
} 
+0

나는 옳은 길을 걷고있는 것처럼 들린다. "가짜 인스턴스"부분을 확장 할 수 있습니까? 설정은 밀폐 된 클래스입니다. 도움을 주셔서 감사합니다 – mfriis

+2

기꺼이 당신이 묻습니다 :) 가짜 인스턴스는 실제 인스턴스의 대체 버전을 의미합니다. 예를 들어, 나는 실제 인스턴스를 상속하고 자신의 가짜 버전을 만들 수 있습니다. FakeSettings 클래스 : 설정. 그런 다음 유닛 테스트에서 FakeSettings를 사용할 수 있습니다. 봉인되었으므로 상속받을 수 없습니다. 따라서 실제 인스턴스가 작업을 수행합니다. 정확히 내가 코드에서 가지고있는 것. – Spock