我在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
覆盖Equals
和GetHashCode
时才有效。或者,编写您的测试用例以重用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");
}
如果你想在内容而不是实例上进行比较,考生应该实现Equals
和GetHashCode
参见:
- 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);
对象a
和b
不是同一个对象!在您的情况下,您必须检查两个列表是否具有相同的长度,如果是这样的话,请检查一个列表中的每个对象是否等于另一列表中的一个对象。
当然,在比较列表中的Examen
对象时,也要考虑到这一点!恰好具有相同属性值的两个不同的Examen
实例不相等。由于这些是您自己的类,您可以:
- 重写
Examen
类中的Equals
(和GetHashCode
*)方法 - 实现
IEqualityComparer<Examen>
EDIT:Jens Kloster(Enumerable.SequenceEqual
)提出了一种更容易比较两个列表的方法。
**如果您想知道为什么要覆盖bot Equals
和GetHashCode
,请查看此处。