继承抽象类的单元测试类
本文关键字:单元测试 测试类 单元 抽象类 继承 | 更新日期: 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()"之前的某些代码导致了问题?你能发布这些代码行吗?