gpt4 book ai didi

c# - 如何在 C# 的单元测试时模拟/伪造/替换/ stub 基类?

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:16 25 4
gpt4 key购买 nike

更新:我已经更改了问题的措辞。以前,是否可以在运行时更改基类是一个是/否问题。

我可能正在这里从事不可能完成的任务,但我似乎已经接近了。我想扩展一个 ASP.NET 控件,并且我希望我的代码可以进行单元测试。此外,我希望能够伪造真实标签的行为(即 ID 生成等),这是真实标签在 nUnit 主机中无法做到的。

这是一个工作示例,它对依赖于真实基类的事物和不依赖于真实基类的事物进行断言——在更现实的单元测试中,测试将依赖于两者——即现有 ID 和一些自定义行为。

无论如何,代码比我说得更好:

public class LabelWrapper : Label //Runtime
//public class LabelWrapper : FakeLabel //Unit Test time
{
private readonly LabelLogic logic= new LabelLogic();

public override string Text
{
get
{
return logic.ProcessGetText(base.Text);
}
set
{
base.Text=logic.ProcessSetText(value);
}
}
}

//Ugh, now I have to test FakeLabelWrapper
public class FakeLabelWrapper : FakeLabel //Unit Test time
{
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()
{
//Wish this was LabelWrapper label = new LabelWrapper(new FakeBase())
LabelWrapper label = new LabelWrapper();
//FakeLabelWrapper label = new FakeLabelWrapper();
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>");
}
}

//System Under Test
internal class LabelLogic
{
internal string ProcessGetText(string value)
{
return value.ToUpper();
}

internal string ProcessSetText(string value)
{
return value.ToUpper();
}
}

最佳答案

这在 .Net 中根本不可能。您不能即时更改已编译的元数据。

想想这会造成的所有破坏。假设我有以下情况

class Example  {
Label l = new LabelWrapper();
}

此代码已执行,突然您的代码运行,将 LabelWrapper 的基类型切换为 FakeLabel。这引发了许多非常棘手的问题,包括但不限于

  • Example 的现有实例会怎样?
  • Example 的新实例会发生什么,因为此代码现在完全无效?
  • 这带来了很多安全噩梦,因为我现在可以以 API 无法解决的方式动态改变我的对象。

关于c# - 如何在 C# 的单元测试时模拟/伪造/替换/ stub 基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2503083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com