测试Remove方法而不调用Add方法

gt。牙刷

我正在为管理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);

您的使用者将删除他们先前添加的对象这是您的用例,“删除将删除先前添加的元素”(请注意,它还会产生出色的测试方法名称)。

AddRemove方法往往是互补的-你不能测试一个没有其他。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CCButton不调用方法

来自分类Dev

NSURLSession方法不调用

来自分类Dev

不调用HttpPost方法

来自分类Dev

异步方法不调用

来自分类Dev

Swift方法:不调用deinit

来自分类Dev

Distinct()不调用equals方法

来自分类Dev

分段控件不调用方法

来自分类Dev

<h:commandButton>不调用方法

来自分类Dev

IEquatable不调用等于方法

来自分类Dev

JAXB不调用Setter方法

来自分类Dev

XMLParser不调用委托方法

来自分类Dev

NSSplitViewController不调用委托方法

来自分类Dev

Distinct()不调用equals方法

来自分类Dev

AVAudioPlayerDelegate不调用该方法

来自分类Dev

UIImagePickerController不调用委托方法

来自分类Dev

调用子类方法而不调用父类

来自分类Dev

线程启动而不调用它的启动方法

来自分类Dev

可可NSCollectionView不调用dataSource方法

来自分类Dev

UIPanGestureRecognizer永不调用操作方法

来自分类Dev

Django不调用模型清理方法

来自分类Dev

JavaFX不调用main(String [] args)方法

来自分类Dev

为什么不调用种子方法?

来自分类Dev

为什么不调用此方法就执行?

来自分类Dev

不调用close方法可以吗?

来自分类Dev

为什么不调用UIViewControllerTransitioningDelegate的方法presentationControllerForPresentedViewController?

来自分类Dev

Linq独特不调用等于方法

来自分类Dev

C#反射不调用方法

来自分类Dev

使用扩展方法而不调用类名

来自分类Dev

方法被执行而不调用它?