如何重构以避免使用填充码

本文关键字:填充 何重构 重构 | 更新日期: 2023-09-27 18:36:31

我是单元测试的新手,正在探索Microsoft Fakes框架 - 主要是因为它是免费的,它允许我使用模拟器包轻松模拟SharePoint对象。 我在SO和其他地方看到过各种提到垫片是邪恶的,我或多或少明白为什么。 我没有得到的是如何在一种特定情况下避免它们 - 换句话说,"我应该如何重构我的代码以避免不得不使用填充码?

对于有问题的代码,我有一个具有属性和方法的 JobProcessor 对象,其中一些是私有的,因为它们只能从公共 Execute 方法调用。 我想测试一下,当调用 Execute 并且有一个可用的作业时,它的 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 方法本身,所以我不在乎它除了我在这里的额外东西之外什么都不做。 据我了解,我现在需要设置一个填充程序,让来自 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
};

在这种情况下,我应该如何避免使用垫片? 有关系吗?

谢谢。

如何重构以避免使用填充码

在这种情况下

,我只是让该方法返回一个布尔值来通知内部调用是否已发生,而不是使用填充程序或存根。

在那里使用假货的问题在于,你假设调用了某个对象的某个方法,测试不应该知道。测试应该是愚蠢的,只能看到代码的外部。与任何其他代码一样,测试不应该关心如何达到某个值,而只关心它是否正确

但是,您的代码还有另一个问题。您正在获取一些未知对象并在同一范围内使用它。您应该从"执行"中删除对 GetJobToProccess 的调用。

这是依赖注入的原则:方法不应该启动和隐藏它的依赖关系;如果它依赖于一个对象,该对象应该可以自由更改或传入。作业的确切实现对于 execute 方法来说应该无关紧要,并且与命名一起意味着您不应该在同一调用中获取该对象并执行它。