我正在为管理Tag对象树的类编写测试:
public class Tag
{
public virtual int Id { get; set; }
public virtual string Description{ get; set; }
private IList<Tag> children = new List<Tag>();
public virtual IEnumerable<Tag> Children
{
get {return children .ToArray();}
}
public void AddChildTag(Tag child)
{
children.Add(child);
}
public void RemoveChildTag(Tag child)
{
children.Remove(child);
}
}
如您所见,设置父属性的唯一模式是通过AddChildTag
方法,而这正是我想要的,我的问题出在单元测试中:由于每个测试都应该是原子的,我该如何测试该RemoveChildTag
方法?
我唯一看到的方法是调用add方法,然后再调用remove,但是这样一来,如果Add存在一些错误,则即使remove的测试也将失败,因此原子性会丢失。
那怎么办?
编辑
我从Tag对象中删除了父属性,因为我不再使用它了根据解决方案使用NUnit和FluentAssertion进行一些测试
[Test]
public void AddChildTagAddsChildren()
{
//Arrange
Tag parent = new Tag();
Tag child = new Tag();
//Act
parent.AddChildTag(child);
//Assert
parent.Children.Should().Contain(child);
}
[Test]
public void RemoveChildTagRemovesAddedChildren()
{
//Arrange
Tag parent = new Tag();
Tag child = new Tag();
parent.AddChildTag(child);
//Act
parent.RemoveChildTag(child);
//Assert
parent.Children.Should().NotContain(child);
}
[Test]
public void RemoveChildTagThrowsNothingWhenNoChild()
{
//Arrange
Tag parent= new Tag();
Tag child= new Tag();
//Act
Action RemoveChild = () => parent.RemoveChildTag(child);
//Assert
RemoveChild.ShouldNotThrow();
}
您的单元测试应反映您班级的实际用例。您的消费者将如何使用RemoveChildTag
方法?哪个更有意义?您将如何使用对象集合?
var parent = new Tag();
// later
parent.RemoveChildTag(child);
… 要么
var parent = new Tag();
parent.AddChildTag(child);
// later
parent.RemoveChildTag(child);
您的使用者将删除他们先前添加的对象。这是您的用例,“删除将删除先前添加的元素”(请注意,它还会产生出色的测试方法名称)。
Add
和Remove
方法往往是互补的-你不能测试一个没有其他。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句