【问题标题】:Using IQueryable object with xUnit Theory将 IQueryable 对象与 xUnit 理论结合使用
【发布时间】:2019-01-18 16:43:58
【问题描述】:

我有一个从 SqlServer 数据库运行计算的程序。我想测试这些计算是否正确完成。目前我能做到这一点的唯一方法是使用带有理论的答案整数,并验证该函数是否为相应的数据库行提供答案整数。

这是次优的,因为我有两个整数用于每个测试,答案和我想要测试的行的索引。

[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);
}

有没有办法做到这一点。如果我运行此代码,我会收到以下错误:UnitTest1.cs(19,21): error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type [C:\Users\co-op7\Documents\GeorgeCode\MovieSite\MovieManage.Tests\MovieManage.Tests.csproj]

【问题讨论】:

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

标签: c# asp.net-core xunit


【解决方案1】:

通常 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多