使用Nunit或Microsoft.VisualStudio.TestTools.UnitTesting。现在我的Assert失败了。
[TestMethod]
public void GivenEmptyBoardExpectEmptyBoard()
{
var test = new Board();
var input = new Board()
{
Rows = new List<Row>()
{
new Row(){Cells = new List<int>(){0,0,0,0}},
new Row(){Cells = new List<int>(){0,0,0,0}},
new Row(){Cells = new List<int>(){0,0,0,0}},
new Row(){Cells = new List<int>(){0,0,0,0}},
}
};
var expected = new Board()
{
Rows = new List<Row>()
{
new Row(){Cells = new List<int>(){0,0,0,0}},
new Row(){Cells = new List<int>(){0,0,0,0}},
new Row(){Cells = new List<int>(){0,0,0,0}},
new Row(){Cells = new List<int>(){0,0,0,0}},
}
};
var lifeOrchestration = new LifeOrchestration();
var actual = lifeOrchestration.Evolve(input);
Assert.AreEqual(expected, actual);
}
9条答案
按热度按时间nszi6y051#
您有两个不同的
Board
示例,因此对Assert.AreEqual
的调用将失败。即使它们的整个内容看起来是相同的,您也是在比较引用,而不是底层值。您必须指定使两个
Board
示例相等的条件。你可以在测试中这样做:
或者你可以在课堂上这样做:* (注意,我在飞行中写了这个-你会想要调整这个)*
von4xj4u2#
我曾经覆盖getHasCode和equals,但我从来不喜欢它,因为我不想为了单元测试而改变我的生产代码。也是一种痛苦。
然后我把太多的反射,比较对象,这是侵入性较低......但这是一种大量的工作(许多角落的情况下)
最后我用途:
http://www.nuget.org/packages/DeepEqual/工作得很好。
更新,6年后:
我现在使用更通用的.NET库fluentassertions,它与上面的功能相同,但具有更多的功能和一个很好的DSL,具体的替代方案是:https://fluentassertions.com/objectgraphs/
经过几年的经验,我仍然不建议覆盖路线,我甚至认为这是一个坏的做法。如果你不小心,你可能会在使用一些集合(如字典)时引入性能问题。另外,当你有一个真实的业务案例来重载这些方法的时候,你会有麻烦,因为你已经有了这个测试代码。生产代码和测试代码应该保持分离,测试代码不应该依赖于实现细节或黑客来实现它们的目标,这使得它们难以维护和理解。
anauzrmj3#
对于普通对象,比如域对象、DTO或实体,你可以简单地将两个示例序列化为一个字符串,然后比较该字符串:
当然,这有各种警告,所以评估一下对于你的类,JSON是否包含应该比较的预期值。
例如,如果类包含非托管资源或不可序列化的属性,则无法正确比较这些资源或属性。默认情况下,它也只序列化公共属性。
js5cn81o4#
ExpectedObjects将帮助您通过属性值比较相等性。它支持:
1.简单对象:return.ToExpectedObject().ShouldEqual(actual);
1.收藏:return.ToExpectedObject().ShouldEqual(actual);
1.合成对象:return.ToExpectedObject().ShouldEqual(actual);
1.部分比较:预期对象需要设计为匿名类型,并使用expected.ToExpectedObject().ShouldMatch(actual)
我喜欢ExpectedObjects,因为我只需要调用2个API来Assert比较对象的相等性:
jobtbby35#
由于在这个问题上还没有提到,有几个其他被广泛采用的库可以帮助解决这个问题:
actual.Should().BeEquivalentTo(expected);
Likeness<MyModel, MyModel>(actual).ShouldEqual(expected);
我个人更喜欢Fluent Assertions,因为它在成员排除等方面提供了更大的灵活性,并且它支持开箱即用的嵌套对象的比较。
希望这对你有帮助!
iezvtpos6#
我想要一个不需要添加依赖项的解决方案,使用VS单元测试,比较两个对象的字段值,并告诉我所有不相等的字段。这是我想出来的。请注意,它也可以扩展为处理属性值。
在我的例子中,这对于比较某些文件解析逻辑的结果以确保两个技术上“不同”的条目具有相同值的字段非常有效。
jei2mxaa7#
Assert方法依赖于对象的Equals和GetHashcode。你可以实现它,但是如果在单元测试之外不需要这个对象相等,我会考虑比较对象上的各个原始类型。看起来对象足够简单,并且不需要覆盖equals。
62o28rlo8#
如果只想比较复杂类型对象的属性,迭代对象属性将给出所有属性。你可以试试下面的代码。
hmmo2u0o9#
也可以使用IEqualityComparer。您可以在顶部添加可比较的方法,而不必重写类本身。如果您想要更深入的检查,可以查看如何处理GetHashCode