почему xunit не позволяет протестировать метод с параметрами? - PullRequest
11 голосов
/ 17 ноября 2011

Я учусь использовать юнит-тест, создаю проект, добавляю ссылку на xunit. И следующие коды:

namespace UnitTestProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [Fact]
        private void test(int number1, string number2)
        {

            int result = number1 + Convert.ToInt32(number2);
            Assert.IsType(Type.GetType("Int32"), result);
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

Когда я запускаю тест с использованием инструмента xunit gui, он говорит:

UnitTestProject.Form1.test: System.InvalidOperationException: Fact Метод UnitTestProject.Form1.test не может иметь параметры Stack Trace: 於 Xunit.Sdk.FactCommand.Execute (Object testClass)
Xunit.Sdk.FixtureCommand.Execute (Object testClass)
Xunit.Sdk.BeforeAfterCommand.Execute (Object testClass)
Xunit.Sdk.LifetimeCommand.Execute (Object testClass)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute (Object testClass)

Итак, как я могу проверить метод / функцию с параметрами?

Ответы [ 3 ]

21 голосов
/ 17 ноября 2011

Также вы можете использовать [Theory] вместо [Fact]. Это позволит вам создавать методы испытаний с различными параметрами. Э.Г.

[Theory]
[InlineData(1, "22")]
[InlineData(-1, "23")]
[InlineData(0, "-25")]
public void test(int number1, string number2)
{
    int result = number1 + Convert.ToInt32(number2);
    Assert.IsType(Type.GetType("Int32"), result);
}

p.s. С xUnit было бы лучше сделать методы тестирования общедоступными.

14 голосов
/ 18 ноября 2011

О случайных значениях и встроенных методах / переменных в тестах. Этот код генерирует 100 случайных пар int / string для вашего теста.

    [Theory]
    [PropertyData("GetTestData")]
    public void test(int number1, string number2)
    {

        int result = number1 + Convert.ToInt32(number2);
        var expectedType = Type.GetType("System.Int32");
        Assert.IsType(expectedType, result);
    }

    public static IEnumerable<object[]> GetTestData
    {
        get { return Enumerable.Repeat(0, 100).Select(x => GenerateTestData()); }
    }

    private static object[] GenerateTestData()
    {
        var rand = new Random(0);
        return new object[] {rand.Next(0,100), rand.Next(0,100).ToString()};
    }
2 голосов
/ 17 ноября 2011

Как бы xunit узнал, что указывать в качестве значений аргументов?Модульный тест должен быть самодостаточным тестом, который устанавливает среду с данными, выполняет требуемое действие, а затем утверждает, что результаты соответствуют ожидаемым.Ваш тест не является автономным, поскольку он опирается на внешние значения для number1 и number2.Попробуйте следующее:

[Fact]
private void TestAdd() {
    //arrange
    int number1 = 10;
    string number2 = "10";

    //act
    object result = Add(number1,number2);

    //assert
    Assert.IsType(Type.GetType("Int32"), result);
}

private object Add(int number1, string number2)
{
    return number1 + Convert.ToInt32(number2);
}

Обратите внимание: то, что вы пытаетесь сделать (параметризованное модульное тестирование), возможно с помощью инструмента Pex

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