SetValue测试使用我的Period类成功但是使用我的Name类失败

时间:2017-03-08 10:32:54

标签: c# testing get set assert

所以我的第一个TestMethod正如预期的那样完成。我测试了我的SetValue方法。

p1 = new DateTimePeriod { From = DateTime.MinValue, To = DateTime.MaxValue };
p2 = new DateTimePeriod { From = DateTime.MaxValue, To = DateTime.MinValue };

[TestMethod]
public void SetPeriodTest()
{
   b.SetValue(ref p1, p2);
   Assert.AreEqual(DateTime.MaxValue, p1.From);
   Assert.AreEqual(DateTime.MinValue, p1.To);
}

但是接下来的测试失败了。显然,x.ANamex.Validx.Id为空,但我的设置与我设置p1.Fromp1.To的方式相同。为什么这些属性返回null?

[TestMethod]
public void SetNameTest()
{
    var x = new Name { AName = "Jack", Valid = p1, Id = "123" };
    var y = new Name { AName = "John", Valid = p2, Id = "321" };
    b.SetValue(ref x, y);
    Assert.AreEqual("John", x.AName);
    Assert.AreEqual(p2, x.Valid);
    Assert.AreEqual("321", x.Id);
}

编辑:

public class Name: Base
{
    private string id;
    public string Id
    {
        get { return id; }
        set { SetValue(ref id, value); }
    }
    private string aName;
    public string AName
    {
        get { return aName; }
        set { SetValue(ref aName, value); }
    }
    private DateTimePeriod valid;
    public DateTimePeriod Valid
    {
        get { return valid; }
        set { SetValue(ref valid, value); }
    }
}

public class DateTimePeriod: Period<DateTime>
{
}

public class Period<T>: Base
{
    private T from;
    private T to;
    public Period()
    {
        from = default(T);
        to = default(T);
    }
    public T From
    {
        get { return from; }
        set { SetValue(ref from, value); }
    }
    public T To
    {
        get { return to; }
        set { SetValue(ref to, value); }
    }
}

EDIT2:

public class Base: object
{
    public void SetValue<T>(ref T field, T value)
    {
        if (field == null) return;
        if (field.Equals(value)) return;
        field = value;
        DoOnChanged();
    }
    public event EventHandler OnChanged;
    protected void DoOnChanged()
    {
        if (OnChanged == null) return;
        OnChanged(this, null);
    }
}

1 个答案:

答案 0 :(得分:0)

如果我在单元测试中调试您的代码,它没有任何问题。我将setter更改为正常使用,因为我不知道您对BaseSetValue使用了什么。

但单元测试在这段代码中工作正常:

namespace SampleUnitTest
{
    [TestClass]
    public class Foo
    {
        [TestMethod]
        public void Bar()
        {
            var p1 = new DateTimePeriod { From = DateTime.MinValue, To = DateTime.MaxValue };
            var p2 = new DateTimePeriod { From = DateTime.MaxValue, To = DateTime.MinValue };
            var x = new Name { AName = "Jack", Valid = p1, Id = "123" };
            var y = new Name { AName = "John", Valid = p2, Id = "321" };
            Assert.AreEqual("John", x.AName);
            Assert.AreEqual(p2, x.Valid);
            Assert.AreEqual("321", x.Id);
        }
    } 

    public class Name
    {
        private string id;
        public string Id
        {
            get { return id; }
            set { id = value; }
        }
        private string aName;
        public string AName
        {
            get { return aName; }
            set { aName = value; ; }
        }
        private DateTimePeriod valid;
        public DateTimePeriod Valid
        {
            get { return valid; }
            set { valid = value ; }
        }
    }

    public class DateTimePeriod : Period<DateTime>
    {
    }

    public class Period<T>
    {
        private T from;
        private T to;
        public Period()
        {
            from = default(T);
            to = default(T);
        }
        public T From
        {
            get { return from; }
            set { from = value; }
        }
        public T To
        {
            get { return to; }
            set { to = value; }
        }
    }
}

我认为SetValue也是您DateTime正在工作而其他课程没有的原因。