Тестирование исключений в Nunit 3.0 и выше - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь проверить исключение, NUnit 3.11 выдает ошибку, а модульный тест не пройден. Я хочу, чтобы Nunit пропустил зеленый, если получает это исключение, а не ошибку. Как бы я решил это?

Не стесняйтесь улучшать код, если хотите, только начал изучать программирование несколько месяцев назад.

При запуске выдает само исключение, не проходит.

Тестовые ошибки out- Сообщение: System.ArgumentException: слишком много данных

public class ParseVendorSupply
{
    public VendorSupply FromCsv(string csvLine)
    {
        string[] values = csvLine.Split(',');
        if (values.Length > 3)
        {
            throw new System.ArgumentException("Too much data");
        }
        VendorSupply vendorsupply = new VendorSupply();
        vendorsupply.VendorId = Convert.ToInt16(values[0]);
        vendorsupply.ProductId = Convert.ToInt16(values[1]);
        vendorsupply.Quantity = Convert.ToInt16(values[2]);
        return vendorsupply;
    }
}

Тест:

public class ParseVendorSupplyNunit
{

    ParseVendorSupply parseVendorSupplytest = new ParseVendorSupply();

    [Test]
    public void FromCsv_ParseCorrectly_Extradata()
    {
        string csvLineTest = "5,8,3,9,5";
        //VendorSupply vendorsupply = parseVendorSupplytest.FromCsv(csvLineTest);
        Assert.That(parseVendorSupplytest.FromCsv(csvLineTest), Throws.ArgumentException);
    }

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Вам нужно передать метод, который вы тестируете, как Action. Затем вы можете использовать метод Assert.Throws<>:

Assert.Throws<ArgumentException>(() => parseVendorSupplytest.FromCsv(csvLineTest));

Существует также версия async, если вы используете async/await

Assert.ThrowsAsync<ArgumentException>(async () => await parseVendorSupplytest.FromCsv(csvLineTest));
0 голосов
/ 12 ноября 2018

Ответы, которые предлагают использовать Action, работают, но Action не является обязательным для NUnit. Я создаю этот, потому что я думаю, что важно, чтобы вы поняли , почему ваш существующий код не работает.

Проблема в том, что первый аргумент вашего assert вызывает метод перед вызовом assert . Ваш Assert.That никогда не вызывается, так как исключение выдается при оценке аргумента.

Определение Action позволяет избежать этой проблемы, поскольку оно указывает на вызов метода, который не будет выполнен немедленно.

Однако, более разговорный способ указать это в NUnit - использовать lambda напрямую ...

Assert.That(() => parseVendorSupplytest.FromCsv(csvLineTest), Throws.ArgumentException);
0 голосов
/ 12 ноября 2018

Метод обтекания , который вы тестируете в Action

Action parseFromCsv = () => parseVendorSupplytest.FromCsv(csvLineTest);
Assert.That(parseFromCsv, Throws.ArgumentException)

А при проверке распространенных исключений, таких как ArgumentException, всегда проверяйте также и сообщения об исключениях.
Поскольку в некоторых других местах может произойти общее исключение, и тест будет пройден по неправильной причине.

Я предпочитаю использовать FluentAssertions, которые, как мне показалось, стали менее читаемыми.

Action parseFromCsv = () => parseVendorSupplytest.FromCsv(csvLineTest);
parseFromCsv.Should().Throw<ArgumentException>().WithMessage("Too much data");
...