我建议将你所拥有的东西转换成这样的东西:
public class MyClass()
{
private IHelper _helper;
public MyClass()
{
//Default constructor normal code would use.
this._helper = new Helper();
}
public MyClass(IHelper helper)
{
if(helper == null)
{
throw new NullException(); //I forget the exact name but you get my drift ;)
}
this._helper = helper;
}
public void LoadData()
{
SomeProperty = this._helper.GetSomeData();
}
public object SomeProperty {get;set;}
}
现在你的类支持所谓的依赖注入。这允许您注入帮助类的实现,并确保您的类只需要依赖于接口。当您模拟它时,您知道您只需创建一个使用 IHelper 接口的模拟并将其传递给构造函数,您的类将使用它,就好像它是真正的 Helper 类一样。
现在,如果您坚持将 Helper 类用作静态类,那么我建议您使用代理/适配器模式并将静态类与另一个支持 IHelper 接口的类(您还需要创建)包装在一起。
如果在某些时候您想更进一步,您可以从修改后的类中完全删除默认的 Helper 实现并使用 IoC(控制反转)容器。如果这对你来说是新的,我建议首先关注为什么所有这些额外的麻烦都是值得的(恕我直言)。
你的单元测试看起来像这样的伪代码:
public Amazing_Mocking_Test()
{
//Mock object setup
MockObject mockery = new MockObject();
IHelper myMock = (IHelper)mockery.createMockObject<IHelper>();
mockery.On(myMock).Expect("GetSomeData").WithNoArguments().Return(Anything);
//The actual test
MyClass testClass = new MyClass(myMock);
testClass.LoadData();
//Ensure the mock had all of it's expectations met.
mockery.VerifyExpectations();
}
如果您有任何问题,请随时发表评论。(顺便说一句,我不知道这段代码是否都能正常工作,我只是在浏览器中输入了它,我主要是在说明概念)。