ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

断言使用FakeItEasy没有使用任何通用参数进行调用

2019-11-11 08:09:49  阅读:213  来源: 互联网

标签:xunit-net fakeiteasy unit-testing net-core c


免责声明-与How to use FakeItEasy to assert a method was not called不同的问题

说明

我有一段代码可以在IOC容器中注册内容,并且可以在测试中使用FakeItEasy来确保进行注册.

我正在尝试找出如何确保不会拨打意外电话的方法.

快速回购(问题归结为几个测试类-这不是真正的实现)

public class Foo
{
    private readonly ICustomContainer m_CustomContainer;

    public Foo(ICustomContainer customContainer)
    {
        m_CustomContainer = customContainer;
    }

    public void Bar()
    {
        m_CustomContainer.Register<IMyInterface, IMyImplementation>();
    }
}

public interface ICustomContainer
{
    void Register<TInterface, TImplementation>() where TImplementation : TInterface;
}

public class UnitTest1
{
    [Fact]
    public void Test1()
    {
        //Arrange
        ICustomContainer fake = A.Fake<ICustomContainer>();
        Foo objectUnderTest = new Foo(fake);

        //Act
        objectUnderTest.Bar();

        //Assert
        A.CallTo(() => fake.Register<IMyInterface, IMyImplementation>()).MustHaveHappened();
        //A.CallTo(() => fake.Register<???>()).MustNotHaveHappened();  //Any generic parameter apart from <IMyInterface, IMyImplementation> must not have happened
    }
}

上面的测试将通过-正确.如果将来我要在Bar()中添加另一个注册,它仍会通过-不好,因为我的测试仅测试已知的场景.

我正在努力实现的目标

因此,鉴于上面为ICustomContainer定义的接口(这是我的IOC容器),我想确保仅按预期方式调用它.

我已经调查过的

过去使用过其他模拟框架(如TypeMock Isolator)之后,我可以将伪对象设置为抛出异常,除非进行了特定(预期)调用.我不知道我是否可以使用FakeItEasy做到这一点.另外,TypeMock隔离器不支持.NET Core,所以对我不利.

如果我有一个不使用泛型参数的方法,则可以获取FakeItEasy来计算该方法已被调用的次数,并期望除了测试预期的调用之外,还使用任何参数来调用该方法.那当然是一个选择,但是这意味着我必须在我的接口上创建一个外观(我想是扩展方法或包装器)来接受类型参数而不是泛型参数,这意味着我浪费了预编译时间我通过通用参数约束得到警告.

实际问题

如何修改测试,以便可以断言未使用.NET Core / FakeItEasy / xUnit预期的参数进行任何意外调用?

解决方法:

我可能会过分简化,但听起来Strict Fake可以帮助您.
创建一个,然后明确允许您想要的任何呼叫.

//Arrange
ICustomContainer fake = A.Fake<ICustomContainer>(x => x.Strict());

// allow just the registrations you want to
A.CallTo(() => fake.Register<IMyInterface, IMyImplementation>()).DoesNothing();

Foo objectUnderTest = new Foo(fake);

//Act
objectUnderTest.Bar();

//Assert
A.CallTo(() => fake.Register<IMyInterface, IMyImplementation>()).MustHaveHappened();

标签:xunit-net,fakeiteasy,unit-testing,net-core,c
来源: https://codeday.me/bug/20191111/2018570.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有