我对单元测试很陌生,并且正在探索 Microsoft Fakes 框架 - 主要是因为它是免费的,它允许我使用 Emulators 包轻松模拟 SharePoint 对象。我在 SO 和其他地方看到过各种提及 Shims 是邪恶的,我或多或少地理解为什么。我没有得到的是如何在一种特定情况下避免它们 - 换句话说,“我应该如何重构我的代码以避免不得不使用垫片?”
对于有问题的代码,我有一个 JobProcessor 对象,它具有属性和方法,其中一些是私有的,因为它们只能从公共 Execute 方法调用。我想测试一下,当调用 Execute 并且有一个 Job 可用时,它的 Process 方法被调用,因为我需要做一些额外的日志记录。
以下是相关代码:
//in system under test - JobProcessor.cs
private IJob CurrentJob { get; set; }
public void Execute()
{
GetJobToProcess(); //stores Job in CurrentJob property if found
if (ShouldProcessJob){
CurrentJob.ProcessJob();
}
}
如果从测试中调用 ProcessJob,我需要做一些额外的事情,所以我在我的测试方法中设置了一个存根来做这些额外的事情:
StubIJob fakeJob = new StubIJob(){
ProcessJob = () =>{
//do my extra things here
}
};
我正在其他地方测试 ProcessJob 方法本身,所以我不在乎它除了我的额外内容之外什么都不做。据我了解,我现在需要设置一个 Shim 以让 JobProcessor(我的测试系统)中的私有方法 GetJobsToProcess 返回我的假作业,以便调用我的存根方法:
processor = new JobProcessor();
ShimJobProcessor.AllInstances.GetJobToProcess = (@this) =>{
var privateProcessor = new PrivateObject(processor);
privateProcessor.SetProperty("CurrentJob", fakeJob); //force my test Job to be processed so the Stub is used
};
在这种情况下,我应该如何避免使用 Shim?有关系吗?
谢谢。