gpt4 book ai didi

c# - 如何将示例(虚拟)数据添加到单元测试中?

转载 作者:可可西里 更新时间:2023-11-01 09:02:36 24 4
gpt4 key购买 nike

在较大的项目中,我的单元测试通常需要一些“虚拟”(示例)数据才能运行。一些默认客户、用户等。我想知道您的设置是什么样的。

  1. 您如何组织/维护这些数据?
  2. 您如何将其应用于您的单元测试(任何自动化工具)?
  3. 您真的需要测试数据还是您认为它没用?

我目前的解决方案:

我区分主数据样本数据,前者在系统投入生产时可用(首次安装),后者是典型用途运行测试(并在开发过程中播放)所需的用例。

我将所有这些存储在一个 Excel 文件中(因为它非常容易维护),其中每个工作表都包含一个特定的实体(例如用户、客户等),并被标记为主或样本。

我有 2 个测试用例,我(错过)使用它们来导入必要的数据:

  1. InitForDevelopment(创建架构、导入主数据、导入样本数据)
  2. InitForProduction(创建架构、导入主数据)

最佳答案

我使用存储库模式并有一个由相关单元测试实例化的虚拟存储库,它提供了一组已知数据,其中包含在各个领域范围内和范围外的示例。

这意味着我可以通过在运行时(通过依赖注入(inject) (CaSTLe))从用于测试的测试单元或生产存储库提供实例化存储库(通过依赖注入(inject) (CaSTLe))来测试我的代码。

我不知道这方面有什么好的网络引用,但我从 Apress 出版的 Steven Sanderson 的专业 ASP.NET MVC 1.0 一书中学到了很多东西。 MVC 方法自然地提供了关注点分离,这是让您的测试以更少的依赖项运行所必需的。

基本要素是您的存储库实现数据访问接口(interface),然后由您在测试项目中构建的假存储库实现相同的接口(interface)。

在我当前的项目中,我有这样一个界面:

namespace myProject.Abstract
{
public interface ISeriesRepository
{
IQueryable<Series> Series { get; }
}
}

这是作为我的实时数据存储库(使用 Linq to SQL)和一个假存储库实现的,因此:

namespace myProject.Tests.Respository
{
class FakeRepository : ISeriesRepository
{
private static IQueryable<Series> fakeSeries = new List<Series> {
new Series { id = 1, name = "Series1", openingDate = new DateTime(2001,1,1) },
new Series { id = 2, name = "Series2", openingDate = new DateTime(2002,1,30),
...
new Series { id = 10, name = "Series10", openingDate = new DateTime(2001,5,5)
}.AsQueryable();

public IQueryable<Series> Series
{
get { return fakeSeries; }
}
}
}

然后实例化使用数据的类,将存储库引用传递给构造函数:

namespace myProject
{
public class SeriesProcessor
{
private ISeriesRepository seriesRepository;

public void SeriesProcessor(ISeriesRepository seriesRepository)
{
this.seriesRepository = seriesRepository;
}

public IQueryable<Series> GetCurrentSeries()
{
return from s in seriesRepository.Series
where s.openingDate.Date <= DateTime.Now.Date
select s;
}
}
}

然后在我的测试中我可以这样处理它:

namespace myProject.Tests
{
[TestClass]
public class SeriesTests
{
[TestMethod]
public void Meaningful_Test_Name()
{
// Arrange
SeriesProcessor processor = new SeriesProcessor(new FakeRepository());

// Act
IQueryable<Series> currentSeries = processor.GetCurrentSeries();

// Assert
Assert.AreEqual(currentSeries.Count(), 10);
}

}
}

然后查看 CaSTLeWindsor 以了解您的实时项目的控制反转方法,以允许您的生产代码通过依赖注入(inject)自动实例化您的实时存储库。这应该会让您更接近您需要去的地方。

关于c# - 如何将示例(虚拟)数据添加到单元测试中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1097514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com