繁体   English   中英

单元测试类继承抽象类

[英]Unit testing classes inheriting abstract class

我有一个像这样的抽象类:

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...
}

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

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
}

但是,当我运行此测试时,即使应该抛出NotImplementedException,构造函数也不会抛出该异常:

[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;
}

-由于派生类将T替换为string ,因此我认为通过像我在原始消息中显示的那样调用基数,可以调用采用Value的构造函数,但是可以采用采用Format的构造函数...
-要解决此问题,在我的StringField类中,我替换了对基本构造函数的调用,如下所示:

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

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

我复制粘贴的代码,对我来说测试将按预期执行:代码将引发新的NotImplementedException()并且测试通过。

也许您正在执行一些旧的dll:s? 还是“引发新的NotImplementedException()”之前的某些代码导致了问题? 您可以发布这些代码行吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM