2014-09-04 78 views
1

我正在与视觉工作室合作编写Nunit测试用例。 在编写测试用例时,我遇到了一个具有受保护方法的类,该方法抛出了“NotImplementedException”类型的异常。 我试图使用调用关键字,但Ncover不包括该部分。 我也尝试使用try catch,但是我的代码审查人员说在测试用例中不要使用try catch块。 所以,朋友有没有其他方式来编写这类问题的测试用例。 我提到类和测试用例,请告诉我如何解决它。如何编写被保护方法抛出异常的测试用例?

类文件: -

public class UpdateMacActivityPriorityTranslator : EntityMapperTranslator<object, CSUpdateMACActivityPriorityResponseType> 
    { 

     protected override CSUpdateMACActivityPriorityResponseType BusinessToService(IEntityTranslatorService service, object value) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

测试案例: - 包含测试方法BusinessToServiceTest已经从派生

public void BusinessToServiceTest() 
     { 
      var updateMacActivityPriorityTranslator = new UpdateMacActivityPriorityTranslator(); 
      var service = MockRepository.GenerateStub<IEntityTranslatorService>(); 
      var value = new object(); 
      var invokeProtectedBusinessToService = new      PrivateObject(updateMacActivityPriorityTranslator,new PrivateType(                  typeof(UpdateMacActivityPriorityTranslator))); 
      NUnit.Framework.Assert.Throws<NotImplementedException>(
       () => 
       invokeProtectedBusinessToService.Invoke("BusinessToService", 
                 new object[] { service, value })); 
     } 
+0

你_could_考虑让'class'(夹具)含测试('BusinessToServiceTest')从类派生测试,也就是从'UpdateMacActivityPriorityTranslator'。但它可能有缺点。另外:如果你这样做,它会简单地'NUnit.Framework.Assert.Throws (()=> BusinessToService(服务,价值));' – 2014-09-04 11:28:40

+0

@JeppeStigNielsen,是的,我也这样做,但如何处理异常而不使用try catch块。 – 2014-09-04 11:30:20

+0

@ChandanMishra为什么这里的例外? – samy 2014-09-04 11:47:50

回答

1

如果您class(夹具)(具有作为基类)UpdateMacActivityPriorityTranslator,我猜你可以这样做:

public void BusinessToServiceTest() 
{ 
    var updateMacActivityPriorityTranslator = new UpdateMacActivityPriorityTranslator(); 
    var service = MockRepository.GenerateStub<IEntityTranslatorService>(); 
    var value = new object(); 
    NUnit.Framework.Assert.Throws<NotImplementedException>(
     () => updateMacActivityPriorityTranslator.BusinessToService(service, value) 
     ); 
} 

或yo ü可以只使用this代替updateMacActivityPriorityTranslator,所以:

public void BusinessToServiceTest() 
{ 
    var service = MockRepository.GenerateStub<IEntityTranslatorService>(); 
    var value = new object(); 
    NUnit.Framework.Assert.Throws<NotImplementedException>(
     () => BusinessToService(service, value) 
     ); 
} 
+0

thnx @Jeppe Stig Nielsen,它为我工作,也减少了测试用例的长度。 – 2014-09-04 12:29:07

0

在您的测试夹具,实现从UpdateMacActivityPriorityTranslator继承,并通过公开测试方法暴露了保护方法的私有嵌套类:

private class TestUpdateMacActivityPriorityTranslator : UpdateMacActivityPriorityTranslator 
{ 
    public CSUpdateMACActivityPriorityResponseType TestBusinessToService(IEntityTranslatorService service, object value) 
    { 
     return this.BusinessToService(service, value); 
    } 
} 

通过这个,您可以通过测试类来测试受保护的方法,并自然调用该方法。

var translator = new TestUpdateMacActivityPriorityTranslator(); 

Assert.Catch<NotImplementedException>(() => translator.TestBusinessToService(null, null));