如何解决NSubstitute中的“命名类型”?

时间:2017-08-06 21:16:09

标签: unit-testing unity-container mstest nsubstitute

我正在使用IUnityContainer注册稍后解析的类型。 我已经注册了以下类型:

// Register a "named type" mapping
container.RegisterType<IProcessHelper, FirstResponseHelper>("FirstResponseHelper");
container.RegisterType<IProcessHelper, SecondResponseHelper>("SecondResponseHelper");

因此,我可以在我的构造函数中使用如下所示:

     public Finish(
        IUnitOfWork unitOfWork   ,
        ILog logger, 
        ..........
        [Dependency("FirstResponseHelper")] IProcessHelper firstResponseHelpe,
        [Dependency("SecondResponseHelper")] IProcessHelper secondResponseHelper
      )
     {
         .........
        _firstResponseHelpe = firstResponseHelper;
        _secondResponseHelper = secondResponseHelper;
     }

...并希望使用Substitute来解决它,就像“下面”一样。但通过传递“名字”=&gt;替代中不允许使用“FirstResponseHelper”! :(

// Trying to resolve in UnitTest, looks like below (passing name)
IProcessHelper firstResponseHelper = Substitute.For<IProcessHelper>("FirstResponseHelper")
IProcessHelper secondResponseHelper = Substitute.For<IProcessHelper>("SecondResponseHelper")

我需要调用FirstResponseHelper&amp;的方法。 SecondResponseHelper,来自我的UnitTest(MSTest)。 因此,我需要使用Substitute.For<>为“命名类型”接口解决它。

1 个答案:

答案 0 :(得分:1)

我假设您要将替补注册为命名注册,以便您可以解析Finish。如果是这种情况,那么您可以使用InjectionFactory返回替代品:

container.RegisterType<IProcessHelper>("FirstResponseHelper",
    new InjectionConstructor(c => Substitute.For<IProcessHelper>()));

container.RegisterType<IProcessHelper>("SecondResponseHelper",
    new InjectionConstructor(c => Substitute.For<IProcessHelper>()));

顺便说一句,我不会使用[DependencyAttribute]而是删除这些属性并定义传递正确依赖关系的InjectionConstructor

container.RegisterType<Finish>(
    new InjectionConstructor(
        new ResolvedParameter<IUnitOfWork>(),
        new ResolvedParameter<ILog>(),
        new ResolvedParameter<IProcessHelper>("FirstResponseHelper"),
        new ResolvedParameter<IProcessHelper>("SecondResponseHelper")));

或执行类似操作的InjectionFactory

container.RegisterType<Finish>(
    new InjectionFactory(c =>
    {
        return new Finish(c.Resolve<IUnitOfWork>(),
            c.Resolve<ILog>(),
            c.Resolve<IProcessHelper>("FirstResponseHelper"),
            c.Resolve<IProcessHelper>("SecondResponseHelper")
    }));