【问题标题】:Xunit - unit test with list or object as parameterXunit - 以列表或对象为参数的单元测试
【发布时间】:2020-01-12 04:06:39
【问题描述】:

我目前正在对我的 REST API 进行单元测试。当我将列表或自定义对象作为参数时,我遇到了问题。

第一个控制器方法有几个参数,包括一个字符串列表。我不知道如何在列表的内联数据中添加值。

private static List<string> TestData()
{
    var testcase = new List<string>();
    testcase.Add("DEV");
    testcase.Add("IT");
    return testcase;
}

[Theory]
[InlineData(0, 10, TestData, "", 3)]
public async Task TestGetPersonItems(int pageNumber, int pageSize, List<string> departments, string filterText, int resultCount)
{
    using (API_DB_Context context = new API_DB_Context(_options))
    {
        // Arrange
        //List<string> departments = new List<string>();
        //departments.Add("DEV");
        List<string> locations = new List<string>();

        PersonenController controller = new PersonenController(context, _mapper);

        // Act
        var controllerResponse = await controller.Get(pageNumber, pageSize, departments, locations, filterText);

        // Assert
        if (resultCount > 0)
        {
            var objectResult = Assert.IsAssignableFrom<ObjectResult>(controllerResponse);
            ICollection<PersonDTO> model = Assert.IsAssignableFrom<ICollection<PersonDTO>>(objectResult.Value);
            Assert.Equal(resultCount, model.Count);
        }
        else
        {
            Assert.IsType<NotFoundObjectResult>(controllerResponse);
            var objectResponse = controllerResponse as ObjectResult;
            Assert.Equal(404, objectResponse.StatusCode);
        }
    }
}

对于第二个控制器方法,我有一个自定义对象和一个整数作为参数。当我开始测试第二个测试时,我收到错误“找不到名为 'SearchData' 的公共静态成员(属性、字段或方法)”

public static IEnumerable<object[]> SearchData()
{
    yield return new object[] {
        new SearchDTO
        {
          searchText = "",
          page = 0,
          pageSize = 10
        }
    };
}

[Theory]
[MemberData(nameof(SearchData), 3)]
public async Task TestSearchPersonItems(SearchDTO searchDTO, int resultCount)
{
    using (API_DB_Context context = new API_DB_Context(_options))
    {
        // Arrange
        PersonenController controller = new PersonenController(context, _mapper);

        // Act
        var controllerResponse = await controller.SearchPersons(searchDTO);

        // Assert
        if (resultCount > 0)
        {
            var objectResult = Assert.IsAssignableFrom<ObjectResult>(controllerResponse);
            ICollection<PersonDTO> model = Assert.IsAssignableFrom<ICollection<PersonDTO>>(objectResult.Value);
            Assert.Equal(resultCount, model.Count);
        }
        else
        {
            Assert.IsType<NotFoundObjectResult>(controllerResponse);
            var objectResponse = controllerResponse as ObjectResult;
            Assert.Equal(404, objectResponse.StatusCode);
        }
    }
}

我有什么不同的地方或者我可以做的更好吗?

提前谢谢你!

【问题讨论】:

  • SearchData 需要,如错误所说,publicstatic 并且与测试在同一类中。 andrewlock.net/…
  • 会员数据需要返回所有参数。您使用的属性不正确
  • @ColinM:代码上写着:public static IEnumerable SearchData()...这不是你的意思吗?

标签: c# .net-core xunit


【解决方案1】:

对于第一个单元测试:

    public static IEnumerable<object[]> TestGetPersonItemsData =>
        new List<object[]>
        {
            new object[] { 0, 10, new List<string> { "DEV", "IT" }, "", 3 }
        };

    [Theory]
    [MemberData(nameof(TestGetPersonItemsData))]
    public async Task TestGetPersonItems(int pageNumber, int pageSize, List<string> departments, string filterText, int resultCount)
    {
        // Test
    }

第二次这样写:

    public static IEnumerable<object[]> TestSearchPersonItemsData =>
        new List<object[]>
        {
            new object[] { new SearchDTO { searchText = "", page = 0, pageSize = 10 }, 3 },
            new object[] { new SearchDTO { searchText = "test", page = 1, pageSize = 10 }, 1 }
        };

    [Theory]
    [MemberData(nameof(TestSearchPersonItemsData))]
    public async Task TestSearchPersonItems(SearchDTO searchDTO, int resultCount)
    {
        // Test
    }

【讨论】:

    【解决方案2】:

    成员数据需要返回参数化测试的所有参数

    public static IEnumerable<object[]> SearchData() {
        yield return new object[] { new SearchDTO { searchText = "", page = 0, pageSize = 10 }, 3 };
        yield return new object[] { new SearchDTO { searchText = "", page = 0, pageSize = 5 }, 6 };
    }
    
    [Theory]
    [MemberData(nameof(SearchData))]
    public async Task TestSearchPersonItems(SearchDTO searchDTO, int resultCount) {
        //...
    }
    

    参考xUnit Theory: Working With InlineData, MemberData, ClassData

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多