2014-07-19 4 views
1

클래스가 있습니다. 내가 단위 테스트를하고 있기 때문에 공용 설정자가이 속성에서 호출되는지 확인하는 것이 좋습니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까?해당 속성 setter가 호출되었는지 확인하십시오.

값이 호출되었음을 입증했는지 확인하고 싶지 않습니다. 난 단지 생성자가 공용 설정기를 사용하고 있는지 확인하기를 원합니다. 이 속성 데이터 형식은 기본 문자열입니다.

답변

0

이것은 구현 세부 사항을 테스트하려고하기 때문에 조롱이 의도 된 일종의 시나리오가 아닙니다. 이 속성이 원래의 클래스가 인터페이스를 통해 액세스 다른 클래스에 있었다면 지금, 당신은 그 인터페이스를 조롱하고 IgnoreArguments 구문 기대 설정합니다 :

public interface IMyInterface 
{ 
    string MyString { get; set; } 
} 

public class MyClass 
{ 
    public MyClass(IMyInterface argument) 
    { 
     argument.MyString = "foo"; 
    } 
} 

[TestClass] 
public class Tests 
{ 
    [TestMethod] 
    public void Test() 
    { 
     var mock = MockRepository.GenerateMock<IMyInterface>(); 
     mock.Expect(m => m.MyString = "anything").IgnoreArguments(); 
     new MyClass(mock); 
     mock.VerifyAllExpectations(); 
    } 
} 

은 당신이 뭘 하려는지 2 문제가 있습니다를 . 첫 번째는 구체적인 클래스를 모의하려고하기 때문에 속성이 가상 인 경우에만 기대치를 설정할 수 있습니다.

두 번째 문제점은 테스트하려는 이벤트가 생성자에서 발생하므로 모의 객체를 만들 때 발생하므로 기대를 설정하기 전에 발생한다는 것입니다.

하면 클래스는 봉인하고, 속성을 사용하면 같은이 함께 테스트하기 위해 자신의 파생 클래스를 생성하여 모의 객체없이 테스트 할 수 있습니다, 가상하지 않은 경우 :

public class RealClass 
{ 
    public virtual string RealString { get; set; } 

    public RealClass() 
    { 
     RealString = "blah"; 
    } 
} 

[TestClass] 
public class Tests 
{ 
    private class MockClass : RealClass 
    { 
     public bool WasStringSet; 

     public override string RealString 
     { 
      set { WasStringSet = true; } 
     } 
    } 

    [TestMethod] 
    public void Test() 
    { 
     MockClass mockClass = new MockClass(); 
     Assert.IsTrue(mockClass.WasStringSet); 
    } 
}