在MsTest单元测试中断言集合内容时出错



我在c#中进行单元测试时遇到问题。他们不回正确的一个,尽管他们应该。

这是测试单元方法中调用的方法的代码

public static List<Examen> filterExamensCities(List<Examen> original, List<string> steden)
{
    List<Examen> result = new List<Examen>();
    foreach (Examen ex in original)
    {
        foreach (string stad in steden)
        {
            if (ex.Locatie == stad)
            {
                result.Add(ex);
            }
        }
    }
    return result;
}

这是测试单元方法的代码

[TestMethod]
public void filterExamensCities()
{
    //Creatie test data
    List<Examen> origineleLijst = new List<Examen>();
    origineleLijst.Add(new Examen(DateTime.Today, 2, 2, true, "Bouwmeesterstraat", 1));
    origineleLijst.Add(new Examen(DateTime.Today, 2, 3, true, "Schilderstraat", 2));
    origineleLijst.Add(new Examen(DateTime.Today, 2, 3, true, "Meistraat", 3));
    List<string> stedenLijst = new List<string>();
    stedenLijst.Add("Meistraat");
    List<Examen> verwachteLijst = new List<Examen>();
    verwachteLijst.Add(new Examen(DateTime.Today, 2, 3, true, "Meistraat", 3));
    //methode oproepen en assert
    List<Examen> resultLijst = FilterModel.filterExamensCities(origineleLijst, stedenLijst);
    Assert.AreEqual(verwachteLijst, resultLijst, "Fout");
}

我正在使用visual studio中的内置测试。

您应该使用CollectionAssert。AreEqual方法(如果您正在比较集合):

CollectionAssert.AreEqual(verwachteLijst, resultLijst);

如果集合中的项类型未实现相等,则可以通过实现IComparer接口来提供自定义比较器。

CollectionAssert.AreEqual(verwachteLijst, resultLijst, new CustomComparer());

Assert.AreEqual检查两个集合实例是否为同一集合。在这种情况下,他们不会查看集合的内容。

请改用CollectionAssert.AreEquivalent。这可能只有在Examen覆盖EqualsGetHashCode时才有效。或者,编写您的测试用例以重用examen实例,在这种情况下,您可以使用CollectionAssert.AreEqual

编写重复使用Examen:实例的测试

[TestMethod]
public void filterExamensCities()
{
    examenDatum = DateTime.Today;
    Examen eersteExamen = new Examen(examenDatum, 2, 2, true, "Bouwmeesterstraat", 1);
    Examen tweedeExamen = new Examen(examenDatum, 2, 3, true, "Schilderstraat", 2);
    Examen derdeExamen = new Examen(examenDatum, 2, 3, true, "Meistraat", 3);
    //Creatie test data
    List<Examen> origineleLijst = new List<Examen>();
    origineleLijst.Add(eersteExamen);
    origineleLijst.Add(tweedeExamen);
    origineleLijst.Add(derdeExamen);
    List<string> lokatieLijst = new List<string>();
    lokatieLijst.Add("Meistraat");
    List<Examen> verwachteLijst = new List<Examen>();
    verwachteLijst.Add(derdeExamen);
    //methode oproepen en assert
    List<Examen> resultLijst = FilterModel.filterExamensCities(origineleLijst, lokatieLijst);
    //use one of these depending on whether Examen implements Equals and GetHashcode properly.       
    CollectionAssert.AreEqual(verwachteLijst, resultLijst, "Fout");
    CollectionAssert.AreEquivalent(verwachteLijst, resultLijst, "Fout");
}

如果你想在内容而不是实例上进行比较,考生应该实现EqualsGetHashCode

参见:

  • http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx
  • 以及https://stackoverflow.com/a/411508/736079

您不妨将测试中的代码重写为:

public static List<Examen> FilterExamensOpLokatie(List<Examen> examensOmTeFilteren, List<string> gewensteLokaties)
{
    return examensOmTeFilteren.Where(examen => gewensteLokaties.Contains(examen.Locatie)).ToList();
}

您应该使用Enumerable.SequenceEqual来比较列表

试试这个:

Assert.IsTrue(Enumerable.SequenceEqual(verwachteLijst, resultLijst));

这需要您的Examen能够确定它是否等于Examen类的其他实例

仔细思考Assert.AreEqual的作用。它检查两个对象是否相等。它们不相等,因为它们是两个不同的物体。

假设您执行以下操作:

var a = new Object();
var b = new Object();
Assert.AreEqual(a, b);

对象ab不是同一个对象!在您的情况下,您必须检查两个列表是否具有相同的长度,如果是这样的话,请检查一个列表中的每个对象是否等于另一列表中的一个对象。

当然,在比较列表中的Examen对象时,也要考虑到这一点!恰好具有相同属性值的两个不同的Examen实例相等。由于这些是您自己的类,您可以:

  • 重写Examen类中的Equals(和GetHashCode*)方法
  • 实现IEqualityComparer<Examen>

EDIT:Jens Kloster(Enumerable.SequenceEqual)提出了一种更容易比较两个列表的方法。

**如果您想知道为什么要覆盖bot EqualsGetHashCode,请查看此处。

最新更新