Tôi viết thử nghiệm cho một thats lớp quản lý cây của các đối tượng Tag:Testing Di phương pháp mà không một lời kêu gọi bổ sung phương thức
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);
}
}
Như bạn có thể thấy phương thức duy nhất để thiết lập thuộc tính cha mẹ là thông qua phương pháp AddChildTag
và điều này là chính xác những gì tôi muốn, vấn đề của tôi là trong thử nghiệm đơn vị: vì mọi thử nghiệm nên là nguyên tử, làm thế nào tôi có thể thử nghiệm phương pháp RemoveChildTag
?
Chỉ cách tôi thấy là một cuộc gọi đến phương thức thêm và sau đó để loại bỏ, nhưng theo cách này nếu Thêm dưới dạng một số lỗi, ngay cả khi kiểm tra xóa sẽ không thành công, do đó nguyên tử bị mất.
Làm cách nào để thực hiện điều đó?
EDIT
Tôi đã gỡ bỏ tài sản cha mẹ từ đối tượng Tag, kể từ khi tôi không sử dụng nó Một số thử nghiệm theo giải pháp sử dụng NUnit và 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();
}
Lưu ý nhỏ: Cũng đáng để kiểm tra hành vi gọi 'Xóa' mà không gọi' Thêm' để kiểm tra xem không có ngoại lệ nào được ném hoặc ngoại lệ chính xác được ném với trạng thái chính xác. – Jonny
Vì loại bỏ phụ thuộc vào 'add', nếu kiểm tra vượt qua bạn biết rằng' nếu thêm công trình, thì hãy xóa tác phẩm'. Khi 'add' được kiểm tra, bạn sẽ biết' remove' hoạt động. – Cruncher
@Jonny, hãy xem bình luận của tôi về câu trả lời của Lukazoid –