scrivo di prova per questo è di classe gestire alberi di oggetti Tag:Testing Rimuovere metodo senza una chiamata al metodo Add
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);
}
}
Come si può vedere l'unica modalità per impostare la proprietà genitore è attraverso il metodo AddChildTag
e questo è esattamente quello che voglio, il mio problema è nel test delle unità: poiché ogni test dovrebbe essere atomico, come posso testare il metodo RemoveChildTag
?
L'unico modo che vedo è una chiamata al metodo add e in seguito alla rimozione, ma in questo modo se Aggiungi come alcuni errori, anche il test di rimozione avrà esito negativo, quindi l'atomicità viene persa.
Come si può fare?
EDIT
ho tolto proprietà Parent dall'oggetto Tag, dal momento che non è più lo uso Alcuni test secondo soluzione utilizzando NUnit e 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();
}
Leggera nota a margine: vale anche la pena di testare il comportamento di chiamare 'Remove' senza chiamare' Add' per verificare che nessuna eccezione sia lanciata o che l'eccezione corretta sia generata con lo stato corretto. – Jonny
Poiché la rimozione dipende da 'add', se il test passa si sa che' se aggiungi funziona, quindi rimuovi works'. Una volta che 'add' è stato testato, allora sai che' remove' funziona. – Cruncher
@Jonny, correggere vedere il mio commento su Lukazoid risposta –