我有一个方法从另一个类调用另一个方法。
我应该如何为这些方法编写单元测试?我应该为这两种方法编写不同的测试用例,还是应该只为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);
}
}
答案 0 :(得分: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);
您的假货可以承担任何数量的口味,您可以再次自己动手或使用库。当我自己滚动时,我通常只在假货中使用支持字典来存储期望和结果,然后在满足期望时返回结果。如果适用,这允许存储多个期望/结果对。但是如果你选择为高度孤立的测试选择这个方向,你会想要研究所有关于假实现的选项。
答案 1 :(得分:1)
您应该为LoadService.InitiateManualRun
方法编写单元测试。
这将有助于验证更高级别的行为,并提供更灵活的测试,如果您更改嵌套方法的签名或其他实现细节,这些测试不会中断。您的单元测试应验证程序的用例或行为。
话虽如此,在你共享的代码中只有一个执行分支,所以我不确定你的单元测试会验证什么。