断言使用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