Asp.net web api 如何在.NET内核中使用xUnit测试强类型的IQueryable
我正在为.NET核心Web API项目进行测试项目。我有一个SchoolService类,它实现了下面的一些方法 服务等级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
公立学校服务: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);
}