Протестируйте с использованием fake, если метод регистрирует ошибку, когда в этом методе генерируется исключение - PullRequest
0 голосов
/ 03 марта 2012

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();

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

MySingleton.Instance не указывает на вашу подделку, вы подделали ILog, а не MySingleton, вы можете настроить методы только на вашей подделке.

Например:

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

Вы должны найти другой способ вызвать исключение внутри блока try catch.

2 голосов
/ 03 марта 2012

Попробуйте это:

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