Asp.net web api 如何在.NET内核中使用xUnit测试强类型的IQueryable

Asp.net web api 如何在.NET内核中使用xUnit测试强类型的IQueryable,asp.net-web-api,.net-core,xunit,nsubstitute,autofixture,Asp.net Web Api,.net Core,Xunit,Nsubstitute,Autofixture,我正在为.NET核心Web API项目进行测试项目。我有一个SchoolService类,它实现了下面的一些方法 服务等级 公立学校服务:ISchoolService { 私立只读学校实体; 公立学校服务(学校实体) { this.schoolEntity=学校实体; } 公共可查询的GetAllSchools() { var query=this.schoolEntity.GetAllSchool(); 返回查询; } 公共SchoolDataView GetSchoolById(Guid I

我正在为.NET核心Web API项目进行测试项目。我有一个SchoolService类,它实现了下面的一些方法

服务等级
公立学校服务:ISchoolService
{
私立只读学校实体;
公立学校服务(学校实体)
{
this.schoolEntity=学校实体;
}
公共可查询的GetAllSchools()
{
var query=this.schoolEntity.GetAllSchool();
返回查询;
}
公共SchoolDataView GetSchoolById(Guid Id)
{
var query=this.schoolEntity.GetSchoolById(Id);
返回查询;
}
我想测试一下 1-GetAllSchools返回对象类型是否为IQueryable? 2-我如何使用autofix或以其他方式为schoolEntity.GetAllSchool()返回fake IQueryable

服务测试
公共类学校服务测试
{
私立只读学校服务学校服务;
private readonly ISchoolEntity schoolEntity=Substitute.For();
公立学校服务测试()
{
学校服务=新学校服务(学校实体);
}
[事实]
public void GetAllSchool\u ShouldReturn\u IQueryableOfSchoolDataView()
{
//安排
//表演
var a=schoolEntity.GetAllSchool();
//断言
断言。??
}
}

我编写了以下测试,以实现我在问题中所述的行为。欢迎听取更多反馈和建议。谢谢

    [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"},
            new SchoolDataView { SchoolID = Guid.NewGuid(), Name = "Kings College"},
            new SchoolDataView { SchoolID = Guid.NewGuid(), Name = "Reading School"}
        }.AsQueryable();

        schoolEntity.GetAllSchool().Returns(schoolDataViewList);

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

        //Assert
        Assert.IsAssignableFrom<IQueryable<SchoolDataView>>(actualSchoolList);
    }
[事实]
public void GetAllSchool\u ShouldReturn\u IQueryableOfSchoolDataView()
{
//安排
var schoolDataViewList=新列表
{
新建SchoolDataView{SchoolID=Guid.NewGuid(),Name=“伦敦小学”},
新建SchoolDataView{SchoolID=Guid.NewGuid(),Name=“温莎格拉默学校”},
新建SchoolDataView{SchoolID=Guid.NewGuid(),Name=“Kings College”},
新学校数据视图{SchoolID=Guid.NewGuid(),Name=“阅读学校”}
}.AsQueryable();
schoolEntity.GetAllSchool().Returns(schoolDataViewList);
//表演
var actualSchoolList=sut.GetAllSchools();
//断言
Assert.IsAssignableFrom(actualSchoolList);
}
或使用自动夹具
[事实]
public void GetAllSchool\u ShouldReturn\u IQueryableOfSchoolDataView()
{
//安排
var fixture=新fixture();
var schoolDataViewMock=fixture.CreateMany();
返回(schoolDataViewMock.AsQueryable());
//表演
var actualSchoolDataList=sut.GetAllSchools();
//断言
Assert.IsAssignableFrom(实际选择催化剂);
}

您的目标是测试服务实现(学校服务)?那你为什么要在iSchoolenty中执行GetAllSchool?你在这里的期望是什么?你调用的是一个假方法,它总是会返回IQueryable。正如我的经验所暗示的:我总是使用Moq框架,你可以很容易地模拟所有的接口实现。谢谢,Martin,我已经回答了我的问题,它给了我一个答案,但需要您的反馈和建议,因为我测试的主题是SchoolService Method,那么这是正确的方法吗?可能我不明白,但是为什么您要测试
GetAllSchool
的返回类型是
IQueryable
,如果编译器已经对其进行了测试?我认为如果return类型类似于
object
,但在您的情况下,一切都很清楚,您只能返回实现
IQueryable
的类型的对象。为其编写测试的原因是什么?我喜欢在您的测试将失败时(我指红线,而不是编译错误)上述方法的反馈?对我来说,似乎永远不会,可能只有当
ActualSchoolAtalList
null
时,我才会根据
null
测试结果,而不是返回类型。
 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"},
            new SchoolDataView { SchoolID = Guid.NewGuid(), Name = "Kings College"},
            new SchoolDataView { SchoolID = Guid.NewGuid(), 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);
    }