Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用发电机对工厂进行单元测试_C#_Unit Testing_Tdd_Nunit - Fatal编程技术网

C# 用发电机对工厂进行单元测试

C# 用发电机对工厂进行单元测试,c#,unit-testing,tdd,nunit,C#,Unit Testing,Tdd,Nunit,我有一个工厂类,它使用生成器类(其中有几个类,每个类都有不同的算法)来生成对象数组。我试图用TDD方法来编程,但是我在决定测试时遇到了很大的困难。我刚刚开始学习TDD,所以我想我的测试,实际上,是丑陋的、令人讨厌的 以下是我在工厂进行的测试: [TestFixture] public class MapRegionFactoryTests { [Test, Description("Tests if a MapRegion is successfully created.")]

我有一个
工厂
类,它使用
生成器
类(其中有几个类,每个类都有不同的算法)来生成对象数组。我试图用TDD方法来编程,但是我在决定测试时遇到了很大的困难。我刚刚开始学习TDD,所以我想我的测试,实际上,是丑陋的、令人讨厌的

以下是我在
工厂进行的测试:

[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?
    }
}
发生器进行一次测试

[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
,但是我如何模拟像generator这样复杂的东西呢?我不能复制整个生成代码,不?

为什么不使用构造函数注入,即将
IMapRegionGenerator
类型的实例传递给
MapRegionFactory
类的构造函数

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

    ...
}

在此之后,您可以为
IMapRegionGenerator
类型创建mock并通过测试。

为什么不使用构造函数注入,即将
IMapRegionGenerator
类型的实例传递给
MapRegionFactory
类的构造函数

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

    ...
}

在此之后,您可以为
IMapRegionGenerator
类型创建mock,并通过测试。

我对您的代码了解不够,无法确切了解此测试的外观,但它应该让您了解如何使用mock generator测试工厂

[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));
}
[测试]
公共无效区域FactoryDelegateStoregGenerator()
{
var mockGenerator=new Mock();
var工厂=新的MapRegionFactory(mockGenerator.Object);
var expectedRegion=新区域();
var regionSize=CreateRandomRegionSize();
mockGenerator.Setup(g=>g.GenerateRegion(regionSize)).Returns(expectedRegion);
factory.SetRegionSize(regionSize);
Assert.That(factory.GetRegion(),Is.SameAs(expectedRegion));
}
如何模拟发电机这样复杂的东西?我无法复制 整个生成代码,不是吗


为了测试工厂,您只需确保它正确使用发电机,不管是什么意思。您的测试,就像工厂的生产代码一样,不关心也不应该关心生成器是如何工作的,只关心它是否履行了合同并返回了一个区域。

我对您的代码了解不够,无法确切了解此测试的外观,但它应该让您了解如何使用模拟生成器测试工厂

[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));
}
[测试]
公共无效区域FactoryDelegateStoregGenerator()
{
var mockGenerator=new Mock();
var工厂=新的MapRegionFactory(mockGenerator.Object);
var expectedRegion=新区域();
var regionSize=CreateRandomRegionSize();
mockGenerator.Setup(g=>g.GenerateRegion(regionSize)).Returns(expectedRegion);
factory.SetRegionSize(regionSize);
Assert.That(factory.GetRegion(),Is.SameAs(expectedRegion));
}
如何模拟发电机这样复杂的东西?我无法复制 整个生成代码,不是吗


为了测试工厂,您只需确保它正确使用发电机,不管是什么意思。您的测试,就像工厂的生产代码一样,不关心也不应该关心发电机如何工作,只关心它履行合同并返回一个区域。

这正是我将要做的-这没有任何问题。我的问题是如何实际模拟和单元测试生成器。我只是复制粘贴生成代码吗?还是我要返回一些随机对象数组?@PavelMatuska,请您在问题中添加
IMapRegionGenerator
接口的定义好吗?另一个答案很准确,但感谢您的努力。我已经把两个答案都加了一个。这正是我要做的——这没有任何问题。我的问题是如何实际模拟和单元测试生成器。我只是复制粘贴生成代码吗?还是我要返回一些随机对象数组?@PavelMatuska,请您在问题中添加
IMapRegionGenerator
接口的定义好吗?另一个答案很准确,但感谢您的努力。我把两个答案都加了一个。最后一句是我一直在寻找的。我不知道是否有必要复制生成代码,或者只是测试工厂如何使用生成器。最后一句话是我一直在寻找的。我不知道是否有必要复制生成代码,或者只是测试工厂如何使用生成器。