2014-01-29 1 views
1

나는 조금이처럼 보이는 DataGridViewCell 클래스 (VS2010)에서 단위 테스트를 쓰고 있어요 : 나는 .FormattedValue이 올바르게 설정되어 공공 재산을 테스트 할접근 자없이 파생 DataGridViewCell을 단위 테스트하는 방법?

public class MyCell : DataGridViewCell 
    { 
     protected override object GetFormattedValue(object value, int rowIndex, ref System.Windows.Forms.DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, System.Windows.Forms.DataGridViewDataErrorContexts context) 
     { 
      return MyCustomFormatting(value); 
     } 

     private object MyCustomFormatting(object value) 
     { 
      var formattedValue = string.Empty; 
      // ... logic to test here 
      return FormattedValue; 
     } 
    } 

. 그러나 테스트중인 셀에 DataGridView 세트가없는 경우이 값은 항상 null을 반환합니다 (Telerik의 JustDecompile 리베이트 도구를 사용하여이를 확인했습니다).

분명히 이것을 무시하고 접근자를 사용하여 보호 된 방법이나 개인적인 방법에 액세스 할 수 있지만 VS2012 이후에는 접근자가 더 이상 사용되지 않습니다.

접근자를 사용하지 않고이 논리를 단위 테스트 할 수 있습니까?

답변

1

DataGridViewCellDataGridView을 설정하려면 분명히해야 할 일이 많으므로 다른 것을 시도해보십시오.

첫째, 특수 서식 않는 구성 요소를 만들 :

public class SpecialFormatter 
{ 
    public object Format(object value) 
    { 
    var formattedValue = string.Empty; 
    // ... logic to test here 
    return FormattedValue; 
    } 
} 

그리고 그것을 당신의 DataGridViewCell 구현 사용 : 다음

public class MyCell : DataGridViewCell 
{ 
    protected override object GetFormattedValue(object value, int rowIndex, ref System.Windows.Forms.DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, System.Windows.Forms.DataGridViewDataErrorContexts context) 
    { 
    return MyCustomFormatting(value); 
    } 

    private object MyCustomFormatting(object value) 
    { 
    return new SpecialFormatter.Format(value); 
    } 
} 

당신이 가서 단위 테스트 SpecialFormatter을하면됩니다 . DataGridViewCell 구현에 계속 진행되는 것이 많다면 테스트하지 않는 것이 좋습니다.

+0

고마워요! 당신이 그것을 지적했을 때 아주 분명합니다. –

0

MSDN Upgrading Unit Tests from Visual Studio 2010에서이 정보를 찾았습니다. 이유는 무엇인가에 대한 대답이 melike의 대답이 아닌 경우 PrivateObject을 사용하는 방법에 대해 설명합니다. melike의 대답은 나를 위해 일한 비록

, 나는 이것이 어떻게 작동하는지 난 그냥 배우라고 생각, 여기 아무도 도움이 경우 샘플 테스트입니다 :

[TestMethod] 
    public void MyCellExampleTest() 
    { 
     var target = new MyCell(); 
     var targetPrivateObject = new PrivateObject(target); 

     var result = targetPrivateObject.Invoke("MyCustomFormatting", new object[] { "Test" }); 

     Assert.AreEqual(string.Empty, result); 
    } 

PrivateObject를 사용하는 한 명백한 단점은 방법이다 이름은 문자열로 저장됩니다. 이름이나 메소드 서명을 변경하면 유지 관리가 더 어려워집니다.