如何对此c#程序进行单元测试?

时间:2017-09-01 23:32:02

标签: c# nunit

给定的程序是:

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'。

1 个答案:

答案 0 :(得分:0)

您的代码中有几个错误导致您误入歧途。

public Adoption adoptionProcess(Client theClient, ref int numberToAdopt, 
                ArrayList animalList)

这告诉编译器animalListArrayList,它是任何类型数据的数组。

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()方法,并避免在任何地方传递客户端。