如何在.NET中使用xUnit测试强类型的IQueryable

问题描述

我正在为.NET CORE Web API项目进行测试。我有SchoolService类,它实现一些方法,如下所示。

服务等级

 public class SchoolService : ISchoolService
{
    private readonly ISchoolEntity schoolEntity;

    public SchoolService(ISchoolEntity schoolEntity)
    {
        this.schoolEntity = schoolEntity;
    }


    public IQueryable<SchoolDataView> GetAllSchools()
    {
        var query = this.schoolEntity.GetAllSchool();
        return query;
    }

    public SchoolDataView GetSchoolById(Guid Id)
    {
        var query = this.schoolEntity.GetSchoolById(Id);
        return query;
    }

我要测试 1- GetAllSchools返回的对象类型是否为IQueryable? 2-我如何使用autofix或其他方式为schoolEntity.GetAllSchool()返回假的IQueryable?

服务测试

 public class SchoolServiceTests
{
    private readonly ISchoolService schoolService;
    private readonly ISchoolEntity schoolEntity = Substitute.For<ISchoolEntity>();

    public SchoolServiceTests()
    {
        schoolService = new SchoolService(schoolEntity);
    }

    [Fact]
    public void GetAllSchool_ShouldReturn_IQueryableOfSchoolDataView()
    {
        //Arrange


        //Act
        var a = schoolEntity.GetAllSchool();

        //Assert
        Assert.??
    }
}

解决方法

我写了以下测试来实现我在问题中陈述的行为。愿意听取更多关于它的反馈和建议。谢谢

    [Fact]
    public void GetAllSchool_ShouldReturn_IQueryableOfSchoolDataView()
    {
        //Arrange
  
        var schoolDataViewList = new List<SchoolDataView>
        {
            new SchoolDataView { SchoolID = Guid.NewGuid(),Name = "London Primary School"},new SchoolDataView { SchoolID = Guid.NewGuid(),Name = "Windsor Gramer School"},Name = "Kings College"},Name = "Reading School"}
        }.AsQueryable();

        schoolEntity.GetAllSchool().Returns(schoolDataViewList);

        //Act
        var actualSchoolList = sut.GetAllSchools();

        //Assert
        Assert.IsAssignableFrom<IQueryable<SchoolDataView>>(actualSchoolList);
    }

或使用自动修复

 [Fact]
    public void GetAllSchool_ShouldReturn_IQueryableOfSchoolDataView()
    {
        //Arrange
        var fixture = new Fixture();

        var schoolDataViewMock = fixture.CreateMany<SchoolDataView>();
       
        schoolEntity.GetAllSchool().Returns(schoolDataViewMock.AsQueryable());

        //Act
        var actualSchoolDataList = sut.GetAllSchools();

        //Assert
        Assert.IsAssignableFrom<IQueryable<SchoolDataView>>(actualSchoolDataList);
    }