Проблема с тестированием NUnit с кодом C # и контрольным примером из файла - PullRequest
0 голосов
/ 15 апреля 2019

Я новичок в C # и NUnit и пытаюсь сделать несколько простых тестов.

Когда я использую жестко закодированные контрольные примеры, например [TestCase (1, 2)], все работает отлично. Я хотел бы использовать текстовый файл в качестве источника Test Case, но не знаю, как это сделать. Я нашел несколько примеров на StackOverflow и в других местах, но он не работает.

// Code that works
namespace UnitTesting.GettingStarted.Tests
{

    [TestFixture]

    // this part works fine
    public class CalculatorTestMultiplication
    {
        [TestCase(1, 2)]
        [TestCase(2, 3)]
        [TestCase(3, 8)]
        [TestCase(1000, 1)]

        public void MultiplierParZero(int lhs, int rhs)
        {
            var systemUnderTest = new Calculator();
            Assert.NotZero(systemUnderTest.Multiply(lhs, rhs));

        }
    }
}

//Code with error

using System;
using System.Collections.Generic;
using System.IO;
using NUnit.Framework;

namespace UnitTesting.GettingStarted.Tests2
{
    public class CalculatorTestMultiplicationFile
    {
        static object[] TestData()
        {
            var reader = new StreamReader(File.OpenRead(@"C:\Test\MultiplicationZero.txt"));
            List<object[]> rows = new List<object[]>();

            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(',');
                rows.Add(values);
            }

            return rows.ToArray<object[]>();   // PROBLEM CODE
        }


        [TestCaseSource("TestCases")]
        public void MultiplyByZero(int lhs, int rhs)
        {

            var systemUnderTest = new Calculator();
            Assert.NotZero(systemUnderTest.Multiply(lhs, rhs));

        }
    }
}

Как и в жестко заданном тестовом примере, я ожидаю, что тест будет пройден, если параметры не равны нулю, что и есть в моем тестовом файле. Я даже не могу запустить этот тест, потому что в строке с кодом: «return rows.ToArray ();» я вижу следующую ошибку: неуниверсальный метод List.ToArray () нельзя использовать с аргументами типа. Очевидно, что что-то не так с объявлением объекта, но я не знаю, как это исправить.

Спасибо

Mike

1 Ответ

0 голосов
/ 15 апреля 2019

Как новичок, заманчиво использовать простые типы и массивы, а object[], безусловно, очень просто.Однако использование объекта немного сбивает с толку, поскольку ошибка связана с типом аргумента.Будет проще, если вы вернете массив из TestCaseData элементов, каждый из которых представляет один тестовый случай, и будете иметь дело с аргументом sinngle за раз.

Например ...

static IEnumerable<TestCaseData> TestData()
{
    var reader = new StreamReader(File.OpenRead(
        @"C:\Test\MultiplicationZero.txt"));

    while (!reader.EndOfStream)
    {
        var line = reader.ReadLine();
        var values = line.Split(',');
        // Assume there are exactly two items, and they are ints
        // If there are less than two or format is incorrect, then
        // you'll get an exception and have to fix the file. 
        // Otherwise add error handling.
        int lhs = Int32.Parse(values[0])
        int rhs = Int32.Parse(values[1]);
        yield return new TestCaseData(lhs, rhs);
    }
}

Отличия от вашего кода:

  1. Использование TestCaseData (не обязательно, но я считаю более понятным).
  2. Анализ значений как целых.В этом суть вопроса.
  3. Возвращение перечислимого числа и использование yield (опять же, не требуется, но может быть более понятным)

ПРИМЕЧАНИЕ: я только набрал это, не так лискомпилировать или запустить.YMMV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...