其他分享
首页 > 其他分享> > 断言使用FakeItEasy没有使用任何通用参数进行调用

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

作者:互联网

免责声明-与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