如何对具有不同参数类型的同一方法的 2 个连续调用进行单元测试

DotNetNewbie1024

使用 C# .NetFrameWork 4.7, Moq 1.4

我正在测试一种进行 2 个接口调用的方法。接口方法接受 1 个参数,该参数也是一个接口。很难对此进行测试,Moq 会抛出铸造错误。

具有以下特征的 2 个连续调用:

InterfaceUnderTest.MethodUnderTest(IEnumerable<IParamInterface>)

完整的代码示例可以在 github 上找到:https : //github.com/JayZhang727/UnitTestingInterfaceParams

以下是基本结构:

导入的接口和实现我无法更改:

public interface IWorkInterface
{
    string DoWork(IEnumerable<IParamInterface> para);
}

public interface IParamInterface
{
    IParamDataInterface GetParamData();
}

public interface IParamDataInterface
{
    string Id { get; set; }
}

public class ParamClass<T> : IParamInterface where T : IParamDataInterface
{
    public T ParamData { get; set; }

    public ParamClass()
    {

    }

    public ParamClass(T para)
    {
        this.ParamData = para;
    }

    public IParamDataInterface GetParamData()
    {
        return ParamData;
    }
}

public class ParamClassA : IParamDataInterface
{
    public ParamClassA()
    {
        this.Id = "Id";
        this.ParamClassAVar = 123;
    }

    public string Id { get; set; }

    public int ParamClassAVar { get; set; }

}

public class ParamClassB : IParamDataInterface
{
    public ParamClassB()
    {
        this.Id = "Id";
        this.ParamClassBVar = "not 123";
    }

    public string Id { get; set; }

    public string ParamClassBVar { get; set; }

}

这是被测类:

public ClassUnderTest(IWorkInterface workInt)
{
    this.WorkClient = workInt;
}

public IWorkInterface WorkClient { get; set; }

public string MethodUnderTest()
{
    var result = string.Empty;

    //Class A is an implementation of IParamDataInterface
    var a = new ParamClassA();
    var theParamA = new ParamClass<ParamClassA>(a);
    var listA = new List<IParamInterface>();
    listA.Add(theParamA);

    result = WorkClient.DoWork(listA);

    //Class B is also an implementation of IParamDataInterface
    var b = new ParamClassB();
    var theParamB = new ParamClass<ParamClassB>(b);
    var listB = new List<IParamInterface>();
    listB.Add(theParamB);

    result = result + WorkClient.DoWork(listB);

    return result;
}

这是我尝试过的测试调用:

private Mock<IWorkInterface> mockClient;

[TestMethod()]
public void DoWorkTest()
{
    mockClient = new Mock<IWorkInterface>(MockBehavior.Strict);
    var target = new ClassUnderTest(mockClient.Object);

    var mockSquence = new MockSequence();

    mockClient.InSequence(mockSquence).Setup(ec => ec.DoWork(It.Is<List<IParamInterface>>(el => ((ParamClassA)((ParamClass<ParamClassA>)el[0]).GetParamData()).ParamClassAVar == 123))).Returns("123");

    mockClient.InSequence(mockSquence).Setup(ec => ec.DoWork(It.Is<List<IParamInterface>>(el => ((ParamClassB)((ParamClass<ParamClassB>)el[0]).GetParamData()).ParamClassBVar == "not 123"))).Returns("not 123");

    //act
    target.MethodUnderTest();


    //assert
    mockClient.VerifyAll();
}

我收到关于无法从 A 类转换到 B 类的错误:

Message: Test method ClassUnderTesting.UnitTests.ClassUnderTestingTests.DoWorkTest threw exception: 
System.InvalidCastException: Unable to cast object of type 'ClassUnderTesting.ParamClass`1[ClassUnderTesting.ParamClassA]' to type 'ClassUnderTesting.ParamClass`1[ClassUnderTesting.ParamClassB]'.

似乎最小起订量没有按顺序进行,出于某种原因,第二个设置胜过第一个设置,顺序似乎没有帮助。有谁知道我应该如何设置和测试这两个调用?

七州

我会在没有顺序的情况下做到这一点。只需设置您的期望,以便在调用 DoWorkParamClassA时返回“123”,并在调用ParamClassB时返回“非 123”。

请注意,如果未给出第一个期望值,则它不会崩溃ParamClassA:它根本不匹配(第二个和 也是如此ParamClassB)。

mockClient
    .Setup(ec => ec.DoWork(
        It.Is<List<IParamInterface>>(el => el[0] is ParamClass<ParamClassA> && ((ParamClass<ParamClassA>)el[0]).ParamData.ParamClassAVar == 123)
    ))
    .Returns("123");

mockClient
    .Setup(ec => ec.DoWork(
        It.Is<List<IParamInterface>>(el => el[0] is ParamClass<ParamClassB> && ((ParamClass<ParamClassB>)el[0]).ParamData.ParamClassBVar == "not 123")
    ))
    .Returns("not 123");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何忽略Rspec中对具有不同参数的同一方法的某些调用?

来自分类Dev

如何使用SFINAE创建同一方法的2个不同实现

来自分类Dev

您可以在同一个Web API控制器中使用2个具有不同参数类型的GET方法吗?

来自分类Dev

是否可以在同一方法中将对象转换为2个不同的事物?

来自分类Dev

如何对Ajax调用进行单元测试

来自分类Dev

在进行单元测试时,如何测试调用另一个功能的功能?

来自分类Dev

如何在Angular 2中对指令进行单元测试?

来自分类Dev

使用Mockito进行Retrofit 2 api调用的单元测试

来自分类Dev

使用 DarkSkyApi 调用进行 Angular 2 服务单元测试

来自分类Dev

NUnit:如何对另一个单元测试失败进行单元测试?

来自分类Dev

如何进行异步调用的单元测试?

来自分类Dev

如何对调用Action的HTML Helper进行单元测试?

来自分类Dev

如何对调用getJSON的JavaScript函数进行单元测试

来自分类Dev

如何对嵌套的HTTP调用进行单元测试

来自分类Dev

如何对调用getJSON的JavaScript函数进行单元测试

来自分类Dev

如何对一个调用另一个返回承诺的函数进行单元测试?

来自分类Dev

仅对一个结果进行单元测试的方法

来自分类Dev

如何对一个空的枚举进行单元测试?

来自分类Dev

开玩笑地对一个函数进行单元测试,该函数调用一个返回Promise的函数

来自分类Dev

如何在同一方法中动态传递调用方法的名称作为参数?

来自分类Dev

Pytest:模拟具有相同side_effect的同一方法的多个调用

来自分类Dev

对通过 Startup 类调用另一个控制器的控制器进行单元测试

来自分类Dev

如何使用NSubstitute模拟对同一方法的调用序列以在AutoFixture中返回不同的值?

来自分类Dev

如何使用NSubstitute模拟对同一方法的调用序列以在AutoFixture中返回不同的值?

来自分类Dev

具有不同参数的调用方法

来自分类Dev

使用标头值对WebAPI2控制器方法进行单元测试

来自分类Dev

如何手动注册Jackson2HalModule进行独立单元测试?

来自分类Dev

在对Symfony2捆绑软件进行单元测试时,如何显示PHP错误?

来自分类Dev

如何模拟/创建X509Certificate2进行单元测试?

Related 相关文章

  1. 1

    如何忽略Rspec中对具有不同参数的同一方法的某些调用?

  2. 2

    如何使用SFINAE创建同一方法的2个不同实现

  3. 3

    您可以在同一个Web API控制器中使用2个具有不同参数类型的GET方法吗?

  4. 4

    是否可以在同一方法中将对象转换为2个不同的事物?

  5. 5

    如何对Ajax调用进行单元测试

  6. 6

    在进行单元测试时,如何测试调用另一个功能的功能?

  7. 7

    如何在Angular 2中对指令进行单元测试?

  8. 8

    使用Mockito进行Retrofit 2 api调用的单元测试

  9. 9

    使用 DarkSkyApi 调用进行 Angular 2 服务单元测试

  10. 10

    NUnit:如何对另一个单元测试失败进行单元测试?

  11. 11

    如何进行异步调用的单元测试?

  12. 12

    如何对调用Action的HTML Helper进行单元测试?

  13. 13

    如何对调用getJSON的JavaScript函数进行单元测试

  14. 14

    如何对嵌套的HTTP调用进行单元测试

  15. 15

    如何对调用getJSON的JavaScript函数进行单元测试

  16. 16

    如何对一个调用另一个返回承诺的函数进行单元测试?

  17. 17

    仅对一个结果进行单元测试的方法

  18. 18

    如何对一个空的枚举进行单元测试?

  19. 19

    开玩笑地对一个函数进行单元测试,该函数调用一个返回Promise的函数

  20. 20

    如何在同一方法中动态传递调用方法的名称作为参数?

  21. 21

    Pytest:模拟具有相同side_effect的同一方法的多个调用

  22. 22

    对通过 Startup 类调用另一个控制器的控制器进行单元测试

  23. 23

    如何使用NSubstitute模拟对同一方法的调用序列以在AutoFixture中返回不同的值?

  24. 24

    如何使用NSubstitute模拟对同一方法的调用序列以在AutoFixture中返回不同的值?

  25. 25

    具有不同参数的调用方法

  26. 26

    使用标头值对WebAPI2控制器方法进行单元测试

  27. 27

    如何手动注册Jackson2HalModule进行独立单元测试?

  28. 28

    在对Symfony2捆绑软件进行单元测试时,如何显示PHP错误?

  29. 29

    如何模拟/创建X509Certificate2进行单元测试?

热门标签

归档