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();
答案 0 :(得分:3)
MySingleton.Instance
并未指出您的假货,您伪造了ILog
,而不是MySingleton
,您只能在假货上配置方法。
例如:
A.CallTo(() => fakeLogger.MethodA()).Throws(new Exception());
你必须弄清楚在try catch-block中引发异常的其他方法。
答案 1 :(得分:2)
试试这个:
A.CallTo(() => MySingleton.Instance.MethodA()).Throws(new Exception());
MySingleton.Instance.MethodA();
A.CallTo(() => fakeLogger.Error(A<object>.Ignored)).MustHaveHappened();