我有一个Factory
类,它使用Generator
类(其中有几个,每个都有不同的算法)来生成对象数组。我试图用TDD方法对此进行编程,但我在决定测试时遇到了很大困难。我刚刚开始使用TDD,所以我猜我的测试实际上是丑陋的丑陋。
这些是我在Factory
上的测试:
[TestFixture]
public class MapRegionFactoryTests
{
[Test,
Description("Tests if a MapRegion is successfully created.")]
public void TestBasicRegionCreation()
{
var mapRegionFactory = new MapRegionFactory();
MapRegion mapRegion = mapRegionFactory.GenerateMapRegion();
Assert.IsTrue(mapRegion != null);
}
[Test,
Description("Tests if a MapRegionFactory's RegionSizeX, RegionSizeY and RegionSizeZ are properly initialized" +
"to their default values.")]
public void TestDefaultPropertyInitialization()
{
var mapRegionFactory = new MapRegionFactory();
Assert.Greater(mapRegionFactory.RegionSizeX, 0);
Assert.Greater(mapRegionFactory.RegionSizeY, 0);
Assert.Greater(mapRegionFactory.RegionSizeZ, 0);
}
[Test,
Description("Tests if properties can only be assigned numbers above zero.")]
public void TestGreaterThanZeroPropetyAssignment()
{
var mapRegionFactory = new MapRegionFactory
{
RegionSizeX = -8,
RegionSizeY = -3,
RegionSizeZ = 0
};
Assert.Greater(mapRegionFactory.RegionSizeX, 0);
Assert.Greater(mapRegionFactory.RegionSizeY, 0);
Assert.Greater(mapRegionFactory.RegionSizeZ, 0);
}
[Test,
Description("Tests if the default RegionFactory can deliver a region filled with tiles.")]
public void TestRegionCount()
{
// Test the count of objects again?
}
}
Generator
的单一测试:
[TestFixture]
public class MapRegionGeneratorTests
{
[Test,
Description("Tests that a region of a certain size is properly filled with Block objects.")]
public void TestDefaultRegionSize()
{
const int regionSize = 16;
var mapRegionGenerator = new MapRegionGenerator();
var regionData = mapRegionGenerator.GenerateRegion(regionSize);
foreach (Block element in regionData)
{
Assert.IsNotNull(element);
}
}
}
到目前为止,我是否正确接近这个?我知道MapRegionFactory
将通过Castle.Windsor注入IMapRegionGenerator
,但我如何模拟像生成器一样复杂的东西?我不能复制整个生成代码,不是吗?
答案 0 :(得分:2)
为什么不使用构造函数注入,即将IMapRegionGenerator
类型的实例传递给MapRegionFactory
类的构造函数?
class MapRegionFactory
{
public MapRegionFactory(IMapRegionGenerator generator)
{
...
}
...
}
在此之后,您可以为IMapRegionGenerator
类型创建模拟并传递它以进行测试。
答案 1 :(得分:1)
我对您的代码了解不足以确切了解此测试的外观,但它应该为您提供如何使用模拟生成器测试工厂的基本概念。
[Test]
public void RegionFactoryDelegatesToRegionGenerator()
{
var mockGenerator = new Mock<IMapRegiongenerator>();
var factory = new MapRegionFactory(mockGenerator.Object);
var expectedRegion = new Region();
var regionSize = CreateRandomRegionSize();
mockGenerator.Setup(g=>g.GenerateRegion(regionSize)).Returns(expectedRegion);
factory.SetRegionSize(regionSize);
Assert.That(factory.GetRegion(), Is.SameAs(expectedRegion));
}
如何模拟像生成器一样复杂的东西?我无法复制 整个生成代码,没有?
出于测试工厂的目的,您只需确保它正确使用发生器,无论正确意味着什么。您的测试,例如工厂的生产代码,不会也不应该关心发电机的工作原理,只需它完成合同并返回一个区域。