0

オブジェクトの配列を生成するために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);
        }
    }
}

これまでのところ、これに正しく取り組んでいますか? Castle.Windsor を介しMapRegionFactoryて注入されることはわかっていますが、ジェネレーターと同じくらい複雑なものをどのようにモックしますか? IMapRegionGenerator生成コード全体を複製することはできませんか?

4

2 に答える 2

2

なぜコンストラクター注入を使用しないのですか?つまり、型のインスタンスをクラスIMapRegionGeneratorのコンストラクターに渡しますか?MapRegionFactory

class MapRegionFactory
{
    public MapRegionFactory(IMapRegionGenerator generator)
    {
        ...
    }

    ...
}

この後、型のモックを作成しIMapRegionGenerator、テストに渡すことができます。

于 2013-01-25T19:22:57.790 に答える
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));
}

ジェネレーターのような複雑なものをモックするにはどうすればよいですか? 生成コード全体を複製することはできませんか?

ファクトリをテストする目的で、ジェネレータが正しく使用されていることを確認するだけで済みます。ファクトリの本番コードと同様に、テストは、ジェネレーターがどのように機能するかを気にしませんし、気にする必要もありません。単に、それがコントラクトを満たし、リージョンを返すことだけです。

于 2013-01-26T15:36:46.207 に答える