Я пишу тест для класса, который управляет деревьями объектов 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
, и это именно то, что я хочу, моя проблема в unit test: поскольку каждый тест должен быть атомарным, как я могу проверить RemoveChildTag
метод?
Единственный способ, который я вижу, - это вызов метода добавления, а затем удаления, но таким образом, если Add в качестве некоторых ошибок, даже тест удаления не удастся, поэтому атомарность будет потеряна.
Как это можно сделать?
ИЗМЕНИТЬ
Я удалил родительское свойство из объекта 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();
}