更新:我改变了问题的措辞。以前,基类是否可以在运行时更改是一个“是/否”问题。
我可能在做不可能完成的任务,但我似乎已经接近了。我想扩展一个ASP.NET控件,并且我希望我的代码是可单元测试的。另外,我希望能够伪造真实标签的行为(即ID生成等),而真实标签在nUnit主机中是做不到的。
这里有一个工作示例,它对依赖于真实基类的内容和不依赖于真实基类的内容进行断言—在更现实的单元测试中,测试将同时依赖于这两个内容—即,现有的ID和一些自定义行为。
不管怎么说代码比我说得好:
public class LabelWrapper : Label
{
private readonly LabelLogic logic= new LabelLogic();
public override string Text
{
get
{
return logic.ProcessGetText(base.Text);
}
set
{
base.Text=logic.ProcessSetText(value);
}
}
}
public class FakeLabelWrapper : FakeLabel
{
private readonly LabelLogic logic= new LabelLogic();
public override string Text
{
get
{
return logic.ProcessGetText(base.Text);
}
set
{
base.Text=logic.ProcessSetText(value);
}
}
}
[TestFixture]
public class UnitTest
{
[Test]
public void Test()
{
LabelWrapper label = new LabelWrapper();
label.Text = "ToUpper";
Assert.AreEqual("TOUPPER",label.Text);
StringWriter stringWriter = new StringWriter();
HtmlTextWriter writer = new HtmlTextWriter(stringWriter);
label.RenderControl(writer);
Assert.AreEqual(1,label.ID);
Assert.AreEqual("<span>TOUPPER</span>", stringWriter.ToString());
}
}
public class FakeLabel
{
virtual public string Text { get; set; }
public void RenderControl(TextWriter writer)
{
writer.Write("<span>" + Text + "</span>");
}
}
internal class LabelLogic
{
internal string ProcessGetText(string value)
{
return value.ToUpper();
}
internal string ProcessSetText(string value)
{
return value.ToUpper();
}
}