我正在为管理标签对象树的类编写测试:
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
method?
我看到的唯一方法是调用add方法,然后调用remove方法,但是这样如果Add出现一些错误,即使remove的测试也会失败,所以原子性就丢失了。
那怎么办呢?
EDIT
我从 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();
}
你的单元测试应该反映actual你的班级的用例。您的消费者将如何使用RemoveChildTag
方法?哪个更有意义?您将如何使用对象集合?
var parent = new Tag();
// later
parent.RemoveChildTag(child);
… or
var parent = new Tag();
parent.AddChildTag(child);
// later
parent.RemoveChildTag(child);
您的消费者将移除他们想要的物品之前添加的。这是您的用例,“删除会删除之前添加的元素”(请注意,它还会产生出色的测试方法名称)。
Add
and Remove
方法通常是互补的——你不能在没有另一种的情况下测试一种方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)