Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#单元测试嵌套函数_C#_Unit Testing - Fatal编程技术网

C#单元测试嵌套函数

C#单元测试嵌套函数,c#,unit-testing,C#,Unit Testing,我有一个从不同类调用另一个方法的方法 我应该如何为这些方法编写单元测试?我应该为这两种方法编写不同的测试用例,还是只为LoadService.InitiateManualRun函数编写测试用例 举个例子会很有帮助 class LoadService { public StagingLoadStatistics InitiateManualRun(string currentUser, string startDate, string endDate) {

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

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

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

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


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

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

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


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

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

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

我将使用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);

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

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

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

我将使用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);

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

@csharp_beginer,请注意,如果您采用这种方法,您正在编写所谓的集成测试,它们是有价值的。但是集成测试往往不能很好地从定义上隔离开来,并且基于它们所做的事情,它们执行起来可能会很慢,特别是当它们涉及到访问数据库或进行web服务调用时。@csharp_beginer,请注意,如果您采用这种方法,您正在编写所谓的集成测试,它们是有价值的。但是集成测试往往无法从定义上很好地隔离,并且基于它们正在做的事情,它们执行起来可能会很慢,特别是当它们涉及到访问数据库或进行web服务调用时。非常感谢您的详细解释非常感谢您的详细解释