Тестовая обработка исключений контекста MSTest

Существует ли способ, которым я могу добраться до исключения, которое было обработано платформой MSTest с помощью TestContext или некоторого другого метода на основном тестовом классе?

Если бы необработанное исключение происходит в одном из моих тестов, я хотел бы вращаться через все объекты в исключении. Словарь данных и отображает их к результату испытаний, чтобы помочь мне выяснить, почему тест перестал работать (мы обычно добавляем данные к исключению, чтобы помочь нам отладить в производственном ENV, таким образом, я хотел бы сделать то же для тестирования).

Примечание: Я не тестирую это, исключение, КАК ПРЕДПОЛАГАЛОСЬ, ПРОИЗОШЛО (у меня есть другие тесты для того), я тестирую допустимый случай, я просто должен видеть данные исключения.

Вот пример кода того, о чем я говорю.

[TestMethod]
public void IsFinanceDeadlineDateValid()
{
    var target = new BusinessObject();
    SetupBusinessObject(target);

    //How can I capture this in the text context so I can display all the data 
    //in the exception in the test result...

    var expected = 100;
    try
    {
        Assert.AreEqual(expected, target.PerformSomeCalculationThatMayDivideByZero());
    }
    catch (Exception ex)
    {
        ex.Data.Add("SomethingImportant", "I want to see this in the test result, as its important");
        ex.Data.Add("Expected", expected);
        throw ex;
    }

}

Я понимаю, что существуют проблемы вокруг, почему у меня, вероятно, не должно быть такого метода инкапсуляции, но у нас также есть тесты sub для тестирования всей функциональности PerformSomeCalculation...

Однако, если тест перестал работать, 99% времени, я повторно выполняюсь, он передает, таким образом, я ничего не могу отладить без этой информации. Я также хотел бы сделать это на Глобальном уровне, так, чтобы, если какой-либо тест перестал работать, я получил информацию в результатах испытаний, в противоположность выполнению его для каждого отдельного теста.

Вот код, который поместил бы информацию об исключении в результаты испытаний.

    public void AddDataFromExceptionToResults(Exception ex)
    {
        StringBuilder whereAmI = new StringBuilder();
        var holdException = ex;
        while (holdException != null)
        {
            Console.WriteLine(whereAmI.ToString() + "--" + holdException.Message);
            foreach (var item in holdException.Data.Keys)
            {
                Console.WriteLine(whereAmI.ToString() + "--Data--" + item + ":" + holdException.Data[item]);
            }

            holdException = holdException.InnerException;
        }
    }
7
задан abatishchev 27 July 2016 в 19:01
поделиться

1 ответ

Я столкнулся с той же проблемой, похоже, для этого нет поддержки. Вы даже не можете использовать ловушку необработанных исключений ApplicationDomain, поскольку, если MSTEST не перехватывает исключения до того, как они выскакивают так далеко, он сам вылетает.

Возможный обходной путь:

    private delegate void TestImplDelegate();

    private void RunTestWithExceptionLogging(TestImplDelegate testImpl)
    {
        try
        {
            testImpl();
        }
        catch (Exception e)
        {
            string message = e.Message; // don't warn about unused variables

            // do logging here
        }
    }

    [TestMethod]
    public void test1()
    {
        RunTestWithExceptionLogging(test1Impl);
    }
    private void test1Impl()
    {
        // test code goes here

        throw new Exception("This should get logged by the test wrapper.");
    }

    [TestMethod]
    public void test2()
    {
        RunTestWithExceptionLogging(test2Impl);
    }
    private void test2Impl()
    {
        // test code goes here

        throw new Exception("This should get logged by the test wrapper.");
    }

Это, конечно, не оптимально, но, по крайней мере, в этом случае у вас не будет нескольких копий кода обработчика исключений.

Я бы порекомендовал подать запрос функции для этого на http://connect.microsoft.com/ (или посмотреть, запрашивал ли уже кто-то еще, и добавить свой голос)

{ {1}}
3
ответ дан 7 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: