c# - 单元测试不会运行:由于 StackOverflowException 导致进程终止
问题描述
我正在进行单元测试来测试我编写的算法,不幸的是,由于这个错误,这些测试甚至不会运行:
[10-6-2018 00:12:00 信息] ========== 运行测试完成:0 次运行 (0:00:06,5685302) ========== [10 -6-2018 00:12:04 信息] ------ 运行测试开始 ------ [10-6-2018 00:12:09 错误] 活动测试运行已中止。原因:由于 StackOverflowException 导致进程终止。
这些都是我的单元测试:
namespace AlgoritmeTest
{
[TestClass]
public class AlgoritmeTests
{
[TestMethod]
public void TestAddingWagonToTrain()
{
Train train = new Train();
Wagon wagon = new Wagon(10);
List<Wagon> expected = new List<Wagon>();
expected.Add(wagon);
train.AddWagon(wagon);
List<Wagon> actual = train.GetWagons();
Assert.AreEqual(expected, actual, "Failed to add wagon to train");
}
[TestMethod]
public void TestAddingAnimalToWagon()
{
Train train = new Train();
Wagon wagon = new Wagon(10);
Animal animal = new Animal("Goudvis", AnimalFood.Meat, AnimalSize.Big);
List<Animal> expected = new List<Animal>();
expected.Add(animal);
wagon.AddAnimal(animal);
List<Animal> actual = wagon.GetAnimals();
Assert.AreEqual(expected, actual, "Failed to add animal to wagon");
}
[TestMethod]
public void TestIfAnimalsAreReturned()
{
Animal animal = new Animal();
Animal goudvis = new Animal("Goudvis", AnimalFood.Meat, AnimalSize.Big);
Animal visstick = new Animal("Visstick", AnimalFood.Meat, AnimalSize.Big);
animal.animalsFromTheCircus.Add(goudvis);
animal.animalsFromTheCircus.Add(new Animal("Potvis", AnimalFood.Plants, AnimalSize.Medium));
animal.animalsFromTheCircus.Add(new Animal("Zalm", AnimalFood.Meat, AnimalSize.Small));
animal.animalsFromTheCircus.Add(visstick);
animal.animalsFromTheCircus.Add(new Animal("Varkenshaasje", AnimalFood.Plants, AnimalSize.Big));
List<Animal> expected = new List<Animal>();
expected.Add(goudvis);
expected.Add(visstick);
List<Animal> actual = animal.GetAllBigMeatEaters();
Assert.AreEqual(expected, actual, "Failed to get all animals which meet criteria");
}
[TestMethod]
public void TestIfAlgorithmStepWorks()
{
Program program = new Program();
Animal animal = new Animal();
Wagon wagon = new Wagon(10);
Wagon wagon2 = new Wagon(10);
Animal goudvis = new Animal("Goudvis", AnimalFood.Meat, AnimalSize.Big);
Animal visstick = new Animal("Visstick", AnimalFood.Meat, AnimalSize.Big);
animal.animalsFromTheCircus.Add(goudvis);
animal.animalsFromTheCircus.Add(visstick);
animal.animalsFromTheCircus.Add(new Animal("Potvis", AnimalFood.Plants, AnimalSize.Medium));
animal.animalsFromTheCircus.Add(new Animal("Zalm", AnimalFood.Meat, AnimalSize.Small));
animal.animalsFromTheCircus.Add(new Animal("Varkenshaasje", AnimalFood.Plants, AnimalSize.Big));
wagon.AddAnimal(goudvis);
wagon2.AddAnimal(visstick);
Train expected = new Train();
expected.AddWagon(wagon);
expected.AddWagon(wagon2);
program.SetUpProgram(animal.animalsFromTheCircus);
Train actual = program.AddAllMeatEaters();
Assert.AreEqual(expected, actual, "Failed to get all animals which meet criteria and place them in train according to alogrithm");
}
}
}
动物.cs
public class Animal
{
private string animalName;
private AnimalFood animalFood;
private AnimalSize animalSize;
public Animal(string animalName, AnimalFood animalFood, AnimalSize animalSize)
{
this.animalName = animalName;
this.animalFood = animalFood;
this.animalSize = animalSize;
}
public Animal()
{
}
public List<Animal> animalsFromTheCircus = new DataGenerator().GenerateAnimals(100);
public List<Animal> GetallAnimals()
{
return animalsFromTheCircus;
}
public List<Animal> GetAllBigMeatEaters()
{
return animalsFromTheCircus.Where(animal => animal.getAnimalSize() == AnimalSize.Big && animal.getAnimalFood() == AnimalFood.Meat).ToList();
}
public List<Animal> GetAllBigMeatEaters(List<Animal> animalsFromTheCircus)
{
return animalsFromTheCircus.Where(animal => animal.getAnimalSize() == AnimalSize.Big && animal.getAnimalFood() == AnimalFood.Meat).ToList();
}
public List<Animal> GetAllSmallMeatEaters()
{
return animalsFromTheCircus.Where(animal => animal.getAnimalSize() == AnimalSize.Small && animal.getAnimalFood() == AnimalFood.Meat).ToList();
}
public List<Animal> GetAllBigPlantEaters()
{
return animalsFromTheCircus.Where(animal => animal.getAnimalSize() == AnimalSize.Big && animal.getAnimalFood() == AnimalFood.Plants).ToList();
}
public List<Animal> GetAllMediumMeatEaters()
{
return animalsFromTheCircus.Where(animal => animal.getAnimalSize() == AnimalSize.Medium && animal.getAnimalFood() == AnimalFood.Meat).ToList();
}
public List<Animal> GetAllMediumPlantEaters()
{
return animalsFromTheCircus.Where(animal => animal.getAnimalSize() == AnimalSize.Medium && animal.getAnimalFood() == AnimalFood.Plants).ToList();
}
public List<Animal> GetAllSmallPlantEaters()
{
return animalsFromTheCircus.Where(animal => animal.getAnimalSize() == AnimalSize.Small && animal.getAnimalFood() == AnimalFood.Plants).ToList();
}
public string getAnimalName()
{
return this.animalName;
}
public AnimalFood getAnimalFood()
{
return this.animalFood;
}
public AnimalSize getAnimalSize()
{
return this.animalSize;
}
}
货车.cs
public class Wagon
{
private List<Animal> animals;
private int maxSize;
public Wagon(int maxSize)
{
this.animals = new List<Animal>();
this.maxSize = maxSize;
}
public void AddAnimal(Animal animal)
{
this.animals.Add(animal);
}
public List<Animal> GetAnimals()
{
return this.animals;
}
}
火车.cs
public class Train
{
private List<Wagon> wagons;
public Train()
{
this.wagons = new List<Wagon>();
}
public void AddWagon(Wagon wagon)
{
this.wagons.Add(wagon);
}
public List<Wagon> GetWagons()
{
return this.wagons;
}
}
我的测试有问题吗,为什么它们不会运行?
解决方案
您显示的代码中没有循环引用,我的蜘蛛侠感觉告诉我问题就在这里
public List<Animal> animalsFromTheCircus = new DataGenerator().GenerateAnimals(100);
更新
每次你创造动物时,它产生的动物创造动物,奇点就会发生。整个宇宙都被吸入
更新 2
这里也存在严重的关注点分离问题,我的意思是为什么类动物甚至有动物列表,我知道没有多少动物有子动物(在任何正常意义上)..
推荐阅读
- python - Python 编码。如何解码技术
- excel - 如何禁用excel工作簿中的全部刷新按钮?
- php - 在一定秒数后删除插入的 MySQL 记录
- r - 分组和总结有条件的日期范围方面 - dplyr?
- python - 从 ArgParser 和/或 PyCharm 配置日志记录
- gcc - 为什么在这个内联汇编语句中忽略了这个指针取消引用?
- amazon-s3 - AWS S3 存储桶加密 - 存储桶属性设置与存储桶策略设置
- android - FirebaseAuth.DefaultInstance 后应用程序崩溃
- ffmpeg - ffmpeg 4.0.2 在网络关闭时不会停止
- virtual-machine - 在虚拟化环境中运行 RPA UI 交互