使用 FakeItEasy 断言没有使用任何通用参数进行调用
Assert that a call was not made with any generic parameters using 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()
中添加另一个注册,它仍然会通过 - 这不太好,因为我的测试只测试已知场景。
我想要达到的目标
因此,考虑到上面为我的 IOC 容器 ICustomContainer
定义的接口,我想确保它仅按预期调用。
我已经调查过了
过去使用过其他模拟框架,例如 TypeMock Isolator,我可以将假对象设置为抛出异常,除非进行特定(预期)调用。我不知道我是否可以用 FakeItEasy 做到这一点。另外 TypeMock Isolator 不支持.NET Core,所以对我不好。
如果我有一个不使用通用参数的方法,我可以让 FakeItEasy 计算该方法被调用的次数,并期望它除了测试之外还被调用了任何参数预期的电话。这当然是一个选项,但这意味着我必须在我的接口上创建一个外观(我猜是作为扩展方法或包装器)来接收类型参数而不是通用参数,这意味着我失去了预编译时间我收到通用参数约束的警告。
真题
我如何修改我的测试,以便我可以断言未使用任何通用参数进行意外调用,而不是我期望使用 .NET Core / FakeItEasy / x单位?
我可能过于简单化了,但听起来 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();
免责声明 - 这与 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()
中添加另一个注册,它仍然会通过 - 这不太好,因为我的测试只测试已知场景。
我想要达到的目标
因此,考虑到上面为我的 IOC 容器 ICustomContainer
定义的接口,我想确保它仅按预期调用。
我已经调查过了
过去使用过其他模拟框架,例如 TypeMock Isolator,我可以将假对象设置为抛出异常,除非进行特定(预期)调用。我不知道我是否可以用 FakeItEasy 做到这一点。另外 TypeMock Isolator 不支持.NET Core,所以对我不好。
如果我有一个不使用通用参数的方法,我可以让 FakeItEasy 计算该方法被调用的次数,并期望它除了测试之外还被调用了任何参数预期的电话。这当然是一个选项,但这意味着我必须在我的接口上创建一个外观(我猜是作为扩展方法或包装器)来接收类型参数而不是通用参数,这意味着我失去了预编译时间我收到通用参数约束的警告。
真题
我如何修改我的测试,以便我可以断言未使用任何通用参数进行意外调用,而不是我期望使用 .NET Core / FakeItEasy / x单位?
我可能过于简单化了,但听起来 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();