C#单元测试嵌套函数

本文关键字:函数 嵌套 单元测试 | 更新日期: 2023-09-27 17:59:41

我有一个方法,它从不同的类调用另一个方法。

我应该如何为这些方法编写单元测试?我应该为两种方法编写不同的测试用例,还是只为LoadService.InitiateManualRun函数编写测试用例?

举个例子会很有帮助。

class LoadService
{    
    public StagingLoadStatistics InitiateManualRun(string currentUser, string startDate, string endDate)
    {
        var response = _repository.InitiateManualRun(currentUser, startDate, endDate);
        return response;
    }
}
class LoadRepository
{     
    public StagingLoadStatistics InitiateManualRun(string currentUser, string startDate, string endDate)
    {
        _webServiceObject.InitiateManualRun(currentUser, startDate, endDate);
    }
}

C#单元测试嵌套函数

您的代码示例并没有显示出额外抽象级别带来的太多附加值,但为了简洁起见,我承认您可能遗漏了一些细节。

如果我正在测试一个调用另一个类的函数的函数,我主要担心的是外部函数为内部函数提供了预期的输入,或者外部函数使用内部函数的输出执行了正确的操作,或者两者兼而有之测试内部函数与测试外部函数无关,我将单独对该类和函数进行测试

我将使用mock/stub隔离我的外部函数,以确保我正在测试我认为正在测试的内容,任何失败都将是函数做了错误的事情,而不是一些嵌套依赖的结果。我对嵌套依赖项的测试将向我揭示该区域中的错误。

考虑到你的原始代码,我会暴露我的依赖

class LoadService
{    
    ILoadRepository _repository;
    public LoadService(ILoadRepository repository)
    {
         _repository = repository;
    }
    public StagingLoadStatistics InitiateManualRun(string currentUser, string startDate, string endDate)
    {
        var response = _repository.InitiateManualRun(currentUser, startDate, endDate);
        return response;
    }
}

基于这段代码,我关心的问题很简单(当然,您的实际代码可能有所不同)。似乎我只需要验证我的参数是否正确地传递给了依赖项,然后返回依赖项的结果。这是一个非常容易编写的测试,但您需要编写依赖项的伪实现,或者使用嘲讽库。但我的测试可能是这样的:

var fakeRepository = new FakeRepository();
var expectedArguments = Tuple.Create(someUser, someStartDate, someEndDate);
var expectedOutput = new StagingLoadStatistics();
fakeRepository.SetOutputForExpectedArguments(expectedArguments, expectedOutput);
var service = new LoadService(fakeRepository);
var result = service.InitiateManualRun(someUser, someStartDate, someEndDate);
Assert.AreSame(expectedOutput, result);

你的赝品可以有多种口味,你也可以自己滚动或使用库。当我滚动自己的赝品时,我通常只在赝品中使用一个后备字典,存储期望值和结果,然后在满足期望值时返回结果。这允许存储多个期望/结果对(如果适用)。但是,如果你选择朝着这个方向进行高度孤立的测试,你会想研究一下围绕虚假实现的所有选项。

您应该为LoadService.InitiateManualRun方法编写单元测试。

这将有助于在更高级别上验证行为,并使测试更加灵活,如果您更改嵌套方法的签名或其他实现细节,测试就不会中断。单元测试应该验证程序的用例或行为。

也就是说,在您共享的代码中只有一个执行分支,所以我不确定您的单元测试会验证什么。