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# 使TestDouble方法根据测试用例表现不同_C#_Unit Testing - Fatal编程技术网

C# 使TestDouble方法根据测试用例表现不同

C# 使TestDouble方法根据测试用例表现不同,c#,unit-testing,C#,Unit Testing,我在C#中有一个名为MyService的包装类,用于ThirdPartyServiceAPI。我想为这个MyService创建一些测试,以确保我按照预期处理了所有案例 ThirdPartyService有以下方法,它公开了这些方法,我们通过MyService包装器在不同的地方使用这些方法 MethodToCreate 由于它是一个第三方服务,我不知道其中包含的业务逻辑。所以我不能直接为该服务创建一个双重测试,因为它是我们使用的库 然而,当不同类型的坏事情发生时,第三方库通常会返回错误,例如

我在C#中有一个名为
MyService
的包装类,用于
ThirdPartyService
API。我想为这个
MyService
创建一些测试,以确保我按照预期处理了所有案例

ThirdPartyService
有以下方法,它公开了这些方法,我们通过
MyService
包装器在不同的地方使用这些方法

  • MethodToCreate
由于它是一个第三方服务,我不知道其中包含的业务逻辑。所以我不能直接为该服务创建一个双重测试,因为它是我们使用的库

然而,当不同类型的坏事情发生时,第三方库通常会返回错误,例如

  • 当出现网络问题时
  • 当与任何其他基础服务通信超时时
  • 当第三方服务关闭时
  • 许多其他情况
当一切正常时,它还会返回实际结果。 我想创建一个
MyServiceTestDouble
类,它将帮助我测试与第三方服务案例的每种类型的交互

所以
IMyService
MyService
看起来像这样(只是一个示例,只有一种方法):


但是我被困在需要让
myservicestdouble
中的方法根据我的单元测试返回不同类型的输出的地方。 就像我正在测试的是一个很好的案例,我希望它返回正确的实际结果。 当我的测试用例用于测试异常时,我希望
myservicestdouble
中的方法返回适当的异常

最好的方法是什么

我认为可行的一种方法是创建一个
myservicecfactory
,它根据单元测试用例场景返回不同的测试双重实现。但这意味着我需要有多个
myservicestdouble
的实现,比如
myservicestdoublegood
myservicestdoublenetworkexceptions
myservicestoutageexceptions
等。 我很确定有一个更好的方法,我目前还不知道

我想知道是否有任何单元测试框架可以帮助进行这种测试


我还想知道,这是否可以在不使用任何框架的情况下以更优雅的方式实现

更好的解决方案是使用该库,它具有根据特殊输入值返回数据或不同类型异常的速记方法。所以你可以说,如果输入是1,抛出一个错误;如果输入为3,则返回数据,以此类推

安装是

以下是一些例子:

使用Moq;
var mockMyService=new Mock();
mockMyService.Setup(o=>o.MethodToCreate(“arg1”、“arg2”))。返回(4);
mockMyService.Setup(o=>o.MethodToCreate(“cut”,“cable”)).Throws(新的NetworkException(“网络关闭”));
或者,您可以使用switch语句在虚拟类中模拟moq的此功能:

public int MethodToCreate(字符串arg1、字符串arg2)
{
开关(arg1){
案例“a”:
抛出新异常();//抛出异常
案例“z”:
返回4;//良好的数据
}
}

I您有一个包装器类。。那么为什么不能向该类添加一些方法呢。。你能展示一下你所拥有的,这样人们就能更好地理解你想要做什么吗?不知道为什么这被否决了。谢谢你的帮助,这并没有破坏讨论的目的。你不需要多个实现,你只需要一个定义double行为的构造函数参数。顺便说一句,我对这个问题投了赞成票,因为它非常有意义。你们两个类中的构造函数似乎都是触发器。我明白了。谢谢你的回答。
public interface IMyService
{
     int MethodToCreate(string arg1, string arg2);
}

public class MyService : IMyService
{
    private readonly ThirdPartyService _thirdPartyService;

    public MyService()
    {
         _thirdPartyService = new ThirdPartyService();
    }

    public int MethodToCreate(string arg1, string arg2)
    {
        var thirdPartyServiceTypeArg = ParseStringToThirdPartyServiceArg(arg1);
        return _thirdPartyService.MethodToCreate(thirdParthyServiceTypeArg, arg2);
    }        
}

public class MyServiceTestDouble : IMyService
{
    public MyServiceTestDouble()
    {

    }

    public int MethodToCreate(string arg1, string arg2)
    {
        return (new Random).Next();
    }
}

public static class MyServiceFactory
{
    public static IMyService GetMyService()
    {
        if(!Config.IsTestMode) return new MyService();
        return new MyServiceTestDouble();
    }
}