继承抽象类的单元测试类

本文关键字:单元测试 测试类 单元 抽象类 继承 | 更新日期: 2023-09-27 18:36:19

我有一个这样的抽象类:

public abstract class Field<T>
{
    private int _length;
    public int Length
    {
        get
        {
            return _length;
        }
        protected set
        {
            if (value <= 0)
            {
                throw new ArgumentOutOfRangeException("The length must be greater than 0");
            }
            else
            {
                _length = value;
            }
        }
    }
    private T _value;
    public T Value 
    {
        get
        {
            if (_value == null) throw new ArgumentException("Field does not have any value set");
            return _value;
        }
        set
        {
            //here obviously I have some code to check the value and assign it to _value
            //I removed it though to show what the problem is
            throw new NotImplementedException();
        }
    }
    public Field(int length, T value)
    {
        Length = length;
        Value = value;
    }
    public Field(int length)
    {
        Length = length;
    }
    //some abstract methods irrelevant to the question...
}

然后我有一个继承字段的类<>

public class StringField : Field<string>
{
    public StringField(int length, string value)
        : base(length, value)
    { }
    public StringField(int length)
        : base(length)
    { }
    //implementation of some abstract methods irrelevant to the question...
}

当我运行这样的测试时,它很好并且通过(构造函数抛出正确的异常):

[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Constructor_LengthOnly_LengthZero_ShouldThrowArgumentOutOfRangeException()
{
    int length = 0;
    StringField sf = new StringField(length);
    //should throw exception
}

但是当我运行这个测试时,构造函数不会抛出,即使它应该抛出 NotImplementException:

[TestMethod]
[ExpectedException(typeof(NotImplementedException))]
public void Constructor_LengthAndValue_ValidLength_TextTooLong_ShouldThrowNotImplementedException()
{
    int length = 2;
    string value = "test";
    StringField sf = new StringField(length, value);
    //should throw exception
}

我做错了什么吗?我不认为我错过了什么,是吗?谢谢。

--编辑--

事实证明一切都很好,这是发生了什么:
- 在Field中,我有另一个属性和构造函数,如下所示:

enprivate string _format;
public string Format 
{ 
    get 
    { 
        return _format; 
    }
    protected set
    {
        _format = value;
     }
}
public Field(int length, string format)
{
    Length = length;
    Format = format;
}

- 由于派生类用 string 替换了 T,我认为通过调用 base 就像我在原始消息中显示的那样,我调用的是需要 Value 的构造函数,但我调用的是接受Format的构造函数......
- 为了解决这个问题,在我的StringField类中,我替换了对基构造函数的调用,如下所示:

public StringField(int length, string value)
    : base(length, value: value)
{ }

使用泛型时类型冲突的一个有趣案例:)

继承抽象类的单元测试类

我复制粘贴了您的代码,对我来说,测试按预期执行:代码抛出一个新的 NotImplementException() 并且测试通过。

也许您正在执行一些旧的dll:s?或者"抛出新的 NotImplementException()"之前的某些代码导致了问题?你能发布这些代码行吗?