给定的程序是:
public Adoption adoptionProcess(Client theClient, ref int numberToAdopt,
ArrayList animalList)
{
ArrayList adoptedAnimals = new ArrayList();
int currentAnimal = 0;
double adoptionFee = 0;
while (numberToAdopt > 0)
{
Animal thisAnimal = (Animal)animalList[currentAnimal];
if (!thisAnimal.adopted)
{
adoptedAnimals.Add(thisAnimal);
adoptionFee += thisAnimal.getadoptionFee();
thisAnimal.adopted = true;
numberToAdopt--;
}
currentAnimal++;
}
return new Adoption(theClient, adoptionFee, adoptedAnimals);
}
我试过的单元测试是:
[TestMethod]
public void adoptionProcessTest()
{
Client amrit = new Client("Amrit", "Amrit", " 1", "Melbourne",
"9898989898", "aamrit10@gmail.com");
ArrayList myAL = new ArrayList();
myAL.Add("anim1");
myAL.Add("anim2");
myAL.Add("anim3");
AdoptAPet adopt = new AdoptAPet();
Adoption actual = adopt.adoptionProcess(amrit, ref num, myAL);
Adoption expected = new Adoption(amrit, 1, );
Assert.AreEqual(expected, actual);
}
它显示错误:无法将类型为'System.Int32'的对象强制转换为'amrit.Animal'。
答案 0 :(得分:0)
您的代码中有几个错误导致您误入歧途。
public Adoption adoptionProcess(Client theClient, ref int numberToAdopt,
ArrayList animalList)
这告诉编译器animalList
是ArrayList
,它是任何类型数据的数组。
Animal thisAnimal = (Animal)animalList[currentAnimal];
这只接受animalList
的{{1}}元素,这与你告诉编译器的内容相矛盾。数组支持搜索,排序和索引等功能,但您唯一能做的就是按顺序遍历每个元素。 Animal
对你的功能来说是一个非常糟糕的选择;它不支持你需要的东西(只包含ArrayList
)并且需要很多你不需要的东西。代表Animal
的更好选择是animalList
。
接下来,您将IEnumerable<Animal>
传递给numberToAdopt
并使用它来计算adoptionProcess
中有多少只动物。但您已经知道来自animalList
的动物数量,并且您没有测试是否animalList.Count()
。为什么你甚至存储这个?采用的动物数量将在numberToAdopt > animalList.Count()
,您所做的只是保留两份相同数据的副本,副本很容易不同步。如果您尝试限制adoptedAnimals.Count()
中的动物数量,请将限制放在adoptedAnimals
中。如果你试图限制AdoptAPet
中的动物数量,那么在将其传递给animalList
之前修剪该列表;不要传递您不需要的数据。
您的测试方法包含以下代码:
adoptionProcess
这甚至都不会编译,当您修复编译器错误时,您将获得运行时异常,因为ArrayList myAL = new ArrayList();
myAL.Add("anim1");
...
Adoption actual = adopt.adoptionProcess(amrit, ref num, myAL);
是字符串列表而myAL
只能处理{{1}的列表}秒。你想做类似的事情:
adoptionProcess
您的Animal
看起来应该更像这样:
var testAnimals = new List<Animal> {
new Animal(you need to put something here),
new Animal(you need to put something here),
...
}
var actual = adopt.AdoptionProcess(amrit, testAnimals);
然后修复编译器指出的AdoptionProcess
中的错误。
您的代码
public Adoption AdoptionProcess(Client theClient, IEnumerable<Animal> animalList)
{
var adoptedAnimals = new List<Animal>();
decimal adoptionFee = 0;
foreach (var animal in animalList)
{
if (!animal.adopted)
{
adoptedAnimals.Add(animal);
adoptionFee += animal.getadoptionFee();
animal.adopted = true;
}
}
return new Adoption(theClient, adoptionFee, adoptedAnimals);
}
会调用adoptionProcessTest
,除非您已覆盖Assert.AreEqual(expected, actual);
,否则会调用参考比较,这可能不是您想要的。
然后考虑制作expected.Equals(actual)
的{{1}}和Adoption.Equals()
方法,并避免在任何地方传递客户端。