在 WebApi 应用程序中,我使用 Ninject 注入一个工厂,该工厂允许消费类创建一个DbContext
根据其要求限定范围的工厂。我希望能够编写一个单元测试来验证对请求范围上下文的同一工厂的两次调用是否返回相同的实例。
出厂界面为:
public interface IContextFactory
{
IMyContext GetContext();
IMyContext GetTransientContext();
}
Ninject 配置如下所示:
Bind<IContextFactory>().ToFactory();
Bind<IMyContext>().To<MyContext>()
.InRequestScope()
.NamedLikeFactoryMethod((IContextFactory f) => f.GetContext());
Bind<IMyContext>().To<MyContext>()
.InTransientScope()
.NamedLikeFactoryMethod((IContextFactory f) => f.GetTransientContext());
我的单元测试如下:
[Fact]
public void RequestScopedContextAlwaysSame()
{
// Arrange
NinjectWebCommon.Start();
var factory = (IContextFactory)NinjectWebCommon.Bootstrapper.Kernel.GetService(typeof(IContextFactory));
//Act
var context1 = factory.GetContext();
var context2 = factory.GetContext();
//Assert
Assert.Same(context1, context2);
}
我希望对工厂的两个调用都返回相同的实例,但实际上它们是两个不同的实例。我认为这是应用程序中的一个测试错误,我已经能够成功验证同一个实例在调用该GetContext()
方法时被注入到不同的消费者中。
我怀疑这在单元测试中不起作用,因为没有HttpContext
并且InRequestScope()
取决于它。有办法解决这个问题吗?