在较大的项目中,我的单元测试通常需要一些“虚拟”(示例)数据才能运行。一些默认客户、用户等。我想知道您的设置是什么样的。
- 您如何组织/维护这些数据?
- 您如何将其应用于您的单元测试(任何自动化工具)?
- 您真的需要测试数据还是您认为它没用?
我目前的解决方案:
我区分主数据和样本数据,前者在系统投入生产时可用(首次安装),后者是典型用途运行测试(并在开发过程中播放)所需的用例。
我将所有这些存储在一个 Excel 文件中(因为它非常容易维护),其中每个工作表都包含一个特定的实体(例如用户、客户等),并被标记为主或样本。
我有 2 个测试用例,我(错过)使用它们来导入必要的数据:
- InitForDevelopment(创建架构、导入主数据、导入样本数据)
- 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/