代码之家  ›  专栏  ›  技术社区  ›  nportelli

使用setter中的代码进行单元测试属性的最佳实践是什么?

  •  1
  • nportelli  · 技术社区  · 15 年前

    我对单元测试还比较陌生,实际上我们正试图在项目中使用它。有这样的财产。

        public TimeSpan CountDown
        {
            get
            {
                return _countDown;
            }
            set
            {
                long fraction = value.Ticks % 10000000;
                value -= TimeSpan.FromTicks(fraction);
                if(fraction > 5000000)
                    value += TimeSpan.FromSeconds(1);
                if(_countDown != value)
                {
                    _countDown = value;
                    NotifyChanged("CountDown");
                }
            }
        }
    

    我的测试是这样的。

    [TestMethod]
        public void CountDownTest_GetSet_PropChangedShouldFire()
        {
            ManualRafflePresenter target = new ManualRafflePresenter();
            bool fired = false;
            string name = null;
            target.PropertyChanged += new PropertyChangedEventHandler((o, a) =>
            {
                fired = true;
                name = a.PropertyName;
            });
            TimeSpan expected = new TimeSpan(0, 1, 25);
            TimeSpan actual;
            target.CountDown = expected;
            actual = target.CountDown;
            Assert.AreEqual(expected, actual);
            Assert.IsTrue(fired);
            Assert.AreEqual("CountDown", name);
        }
    

    问题是如何在setter中测试代码?我要把它分解成一种方法吗?如果我这样做,它可能是私人的,因为没有其他人需要使用这个。但他们说不要测试私人方法。如果这是唯一的情况,就要上课吗?这段代码的两种用法会使一个类有价值吗?从设计的角度来看,这个代码有什么问题。什么是正确的?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Paolo    15 年前

    您的方法很好(调用setter,然后检查get返回预期值)。

    确保您选择了一组测试值,这些测试值执行该setter中的所有路径。单次设置/获取测试的覆盖范围不够。