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

标签 c# unit-testing testing nunit

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

  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/

相关文章:

c# - 使用数据绑定(bind),根据 ComboBox 中选定的时区在文本框中显示时间

c# - 删除和退格在 ReSharper 中不起作用

angular - 单击事件发生时如何对下拉菜单进行单元测试

android - 如何正确测试appwidget?

java - JUnit 5 中的 @TestInstance 注释有什么用?

python - 在 PyCharm 中运行 Django 测试

C# 随机对生成

c# - NuGet包库中的依赖注入(inject)

ruby-on-rails - 什么不能在 Rails 中测试?

testing - 用本地脚本替换对远程脚本的引用