C# 用xUnit理论使用IQueryable对象

C# 用xUnit理论使用IQueryable对象,c#,asp.net-core,xunit,C#,Asp.net Core,Xunit,我有一个运行SqlServer数据库计算的程序。我想测试一下这些计算是否正确。目前,我唯一能做到这一点的方法是在理论上使用answer int,并验证函数是否为相应的数据库行提供了answer int 这是次优的,因为每个测试都有两个整数,即要测试的行的答案和索引 [Theory] [InlineData(db.movieTable.Take(1).Select(p => p))] public void Test1(IQueryable<movieTable> value)

我有一个运行SqlServer数据库计算的程序。我想测试一下这些计算是否正确。目前,我唯一能做到这一点的方法是在理论上使用answer int,并验证函数是否为相应的数据库行提供了answer int

这是次优的,因为每个测试都有两个整数,即要测试的行的答案和索引

[Theory]
[InlineData(db.movieTable.Take(1).Select(p => p))]
public void Test1(IQueryable<movieTable> value)
{
    var result = db.movieTable.Take(1).Select(p => p).ToList().ElementAt(0).Price;
    Assert.True(value.ToList().ElementAt(0).Price == 10);
}
[理论]
[InlineData(db.movieTable.Take(1).选择(p=>p))]
公共void Test1(IQueryable值)
{
var result=db.movieTable.Take(1).Select(p=>p).ToList().ElementAt(0).Price;
Assert.True(value.ToList().ElementAt(0.Price==10);
}

有没有办法做到这一点。如果我运行这段代码,我会得到以下错误:
UnitTest1.cs(19,21):错误CS0182:属性参数必须是常量表达式、typeof表达式或属性参数类型的数组创建表达式[C:\Users\co-op7\Documents\GeorgeCode\MovieSite\MovieManage.Tests\MovieManage.Tests.csproj]

通常,内联数据的要点是使用相同的测试逻辑,但隔离预期输入和输出的差异

[Theory]
[InlineData(1, 10.00m)]
[InlineData(2, 14.50m)]
public void Test1(int movieId, decimal expectedPrice)
{
    var result = db.movieTable.Single(p => p.Id == movieId);
    Assert.True(result.Price == expectedPrice);
}

通常,InlineData的要点是使用相同的测试逻辑,但隔离预期输入和输出的差异

[Theory]
[InlineData(1, 10.00m)]
[InlineData(2, 14.50m)]
public void Test1(int movieId, decimal expectedPrice)
{
    var result = db.movieTable.Single(p => p.Id == movieId);
    Assert.True(result.Price == expectedPrice);
}

一旦调用
ToList()
就不需要
ElementAt()
。您可以像对待任何列表一样使用
[0]
,您想做什么?您没有在任何地方使用
result
。您使用
value
的方式也没有意义,它检查测试数据是否有特定的价格。它不测试您自己的代码。任何列表或数组都可以通过调用
AsQueryable()
转换为
IQueryable
。如果您想测试您的查询,您可以创建一个电影数组,并使用
var myArray=…,将其转换为IQueryable。。。;var queryable=myArray.AsQueryable()
并使用它。
Take(1)。Select(p=>p)
等同于单独使用
Take(1)
.First()
会更好,因为没有理由调用
ToList().ElementAt(0)
一旦调用
ToList()
就不需要
ElementAt()
。您可以像对待任何列表一样使用
[0]
,您想做什么?您没有在任何地方使用
result
。您使用
value
的方式也没有意义,它检查测试数据是否有特定的价格。它不测试您自己的代码。任何列表或数组都可以通过调用
AsQueryable()
转换为
IQueryable
。如果您想测试您的查询,您可以创建一个电影数组,并使用
var myArray=…,将其转换为IQueryable。。。;var queryable=myArray.AsQueryable()
并使用它。
Take(1)。Select(p=>p)
等同于单独使用
Take(1)
.First()
会更好,因为没有理由调用
ToList().ElementAt(0)