0

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

我应该如何为这些方法编写单元测试?我应该为这两种方法编写不同的测试用例还是应该只为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);
    }
}
4

2 回答 2

3

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

如果我正在测试一个调用另一个类函数的函数,我主要关心的是外部函数为内部函数提供了预期的输入,或者外部函数使用内部函数的输出执行了正确的操作,或者两者兼而有之。测试内部函数不是测试外部函数的关注点,我会自己测试那个类和函数。

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

鉴于您的原始代码,我将公开我的依赖项

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);

你的赝品可以有多种口味,你也可以自己制作或使用图书馆。当我自己滚动时,我通常只在假货中使用一个支持字典来存储期望和结果,然后在满足期望时返回结果。如果适用,这允许存储多个期望/结果对。但是,如果您选择朝着这个方向进行高度隔离的测试,那么您将需要研究围绕虚假实现的所有选项。

于 2013-02-15T22:51:24.350 回答
1

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

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

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

于 2013-02-15T22:17:42.747 回答