Трудности с использованием InlineData в модульном тесте - параметр является контроллером - PullRequest
0 голосов
/ 04 октября 2019

Я новичок в тестировании и сейчас учусь использовать xUnit.

Я написал приведенный ниже тест, который работает и дает результаты, которые я ищу, но я думаю, что я смогу сделать его чище, как при использовании TestCase в nUnit. Поэтому я пытаюсь использовать InlineData, который, как я понимаю, называется xUnits "TestCase", но я не знаю, как это сделать.

При попытке настроить его, как показано ниже (см. Строки с комментариями), затем он говорит мне

    [Theory]
    // [InlineData("")] // wanna use InlineData just to make the code/test cleaner.
    // [InlineData(null)]
    public async Task Get_Return_Something(
        MyController sut)
    {
        var result1 = await sut.Get(""); // when placing "sut" as param, I get: cannot convert from MyController to string. 
        var result2 = await sut.Get(null); // same applies here..

        result1.ShouldBeOfType(typeof(OkObjectResult));
        result2.ShouldBeOfType(typeof(BadRequestObjectResult));
    }

Мой вопрос - как мне реализовать InlineData, чтобы тест был чище. И возможно ли вообще, когда у меня есть контроллер в качестве параметра?

Просто чтобы прояснить это -> должен ли быть способ использовать синтаксис из nUnit:

// something like this
[TestCase("", OkObjectResult)]
[TestCase(null, BadRequestObjectResult)]
public async Task Get_Return_Something(MyController sut, param1, param2)
{
    var result = await.sut.Get(param1);
    result.ShouldBeOfType(typeof(param2));
}

Может быть, nUnitпример неправильный - но я пытаюсь указать, что я ищу, говоря более чистый код. Следуя логике TestCase, я могу легко расширить свой тест до 10-15 различных тестовых случаев. И я слышал, что xUnit делает что-то похожее с InlineData (что, как сказал мне LasseVågsætherKarlsen, было невозможно) - или затем MemberClass или ClassData.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Наконец мне удалось это исправить. На самом деле можно использовать InlineData - но не так просто (imo), как с nUnit. Вот решение:

[Theory]
[InlineData("", typeof(OkObjectResult))]
[InlineData(null, typeof(BadRequestObjectResult))]
public async Task Get_Return_Something(param1, param2){

    // moq MyController with its parameters/objects
    ...


    var result = await sut.Get(param1);

    result.ShouldBeOfType(param2);
}

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

0 голосов
/ 04 октября 2019

Возможность 1

  1. Создать MyControllerClassData
    public class MyControllerClassData : IEnumerable<object[]>
    {
        public IEnumerator<object[]> GetEnumerator()
        {
            yield return new object[] {
                new MyController
                {
                  Id = 1,
                  // ...
                }
            };
        }
        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }
Изменить свою теорию
    [Theory]
    [ClassData(typeof(MyControllerClassData))]
    public async Task Get_Return_Something(MyController sut)
    {
        var result1 = await sut.Get(""); // when placing "sut" as param, I get: cannot convert from MyController to string. 
        var result2 = await sut.Get(null); // same applies here..

        result1.ShouldBeOfType(typeof(OkObjectResult));
        result2.ShouldBeOfType(typeof(BadRequestObjectResult));
    }

Возможность 2

  1. Создать класс MyController в конструкторе и сохранить его в частной собственности
  2. Изменитьпараметры для строки и objectResult, который вы хотите
  3. Используйте всегда один и тот же MyController, используйте строку, чтобы сделать Get(), и проверьте ее в соответствии с ожидаемым objectResult.

Это решение выглядит чище, поскольку у вас есть один тест для каждой ситуации.

...