2012-03-03 37 views
0

enter code here我有一種在該方法中引發異常時記錄錯誤的方法。 該方法在單例內是非靜態的。如果方法在該方法中引發異常時記錄錯誤,則使用僞造測試

public object MethodA() 
    { 
     try 
     { 
      //code 
          SomeObj.Print(); //updated 
     } 
     catch (Exception ex) 
     { 
      log.Error(ex); 
     } 
    } 

下面的單元測試代碼引發的NullReferenceException:

    var fakeLogger = A.Fake<ILog>(); 

     MySingleton.Instance.Initialize(fakeLogger); 

     A.CallTo(() => MySingleton.Instance.MethodA() 
      .Invokes((x) => { throw new Exception(); }); 
       //.Throws(new Exception()); --even this doesnt work 
     A.CallTo(() => fakeLogger.Error(A<object>.Ignored)).MustHaveHappened(); 


Stack trace: 
at FakeItEasy.Creation.CastleDynamicProxy.CastleDynamicProxyInterceptionValidator.GetReasonForWhyMethodCanNotBeIntercepted(MethodInfo method) 
at FakeItEasy.Creation.CastleDynamicProxy.CastleDynamicProxyInterceptionValidator.MethodCanBeInterceptedOnInstance(MethodInfo method, Object callTarget, String& failReason) 
at FakeItEasy.Creation.CastleDynamicProxy.CastleDynamicProxyGenerator.MethodCanBeInterceptedOnInstance(MethodInfo method, Object callTarget, String& failReason) 
at FakeItEasy.Creation.ProxyGeneratorSelector.MethodCanBeInterceptedOnInstance(MethodInfo method, Object callTarget, String& failReason) 
at FakeItEasy.Configuration.DefaultInterceptionAsserter.AssertThatMethodCanBeInterceptedOnInstance(MethodInfo method, Object callTarget) 
at FakeItEasy.Configuration.FakeConfigurationManager.AssertThatMemberCanBeIntercepted(LambdaExpression callSpecification) 
at FakeItEasy.Configuration.FakeConfigurationManager.CallTo(Expression`1 callSpecification) 
at FakeItEasy.A.CallTo(Expression`1 callSpecification) 

解決方案: 我不得不讓我的非假方法拋出一個異常,這是我如何做。

var fakeLogger = A.Fake<ILog>(); 
var someObject = A.Fake<SomeObject>(); 
MySingleton.Instance.Initialize(fakeLogger); 
A.CallTo(() => someObject.Print()).Throws(new Exception()); //key 
MySingleton.Instance.MethodA(); 
A.CallTo(() => fakeLogger.Error(A<object>.Ignored)).MustHaveHappened(); 

回答

3

MySingleton.Instance不指向你的假,你僞造的ILog,不是MySingleton,只能配置在你的假方法。

例如:

A.CallTo(() => fakeLogger.MethodA()).Throws(new Exception()); 

你必須找出一些其他的方式來提高你嘗試catch塊中的例外。

2

試試這個:

A.CallTo(() => MySingleton.Instance.MethodA()).Throws(new Exception()); 
MySingleton.Instance.MethodA(); 
A.CallTo(() => fakeLogger.Error(A<object>.Ignored)).MustHaveHappened(); 
+0

仍然給我一個空行參考異常行A.CallTo(()=> MySingleton.Instance.MethodA())。拋出(新的異常());「 – 2012-03-03 07:22:58

+0

嗯...是MySingleton.Instance null? – 2012-03-04 05:15:45

+0

謝謝!更新我的解決方案 – 2012-03-06 01:19:17

相關問題