C# 如何在MS unity中注册rhino存根?

C# 如何在MS unity中注册rhino存根?,c#,unit-testing,unity-container,rhino-mocks,C#,Unit Testing,Unity Container,Rhino Mocks,我使用Msunity容器和rhinomock创建存根 我尝试创建存根并将其注册到unity容器中 IUnityContainer container = ContainerManager.GetDefaultContainer; var loggerStub = MockRepository.GenerateStub<ILogger>(); container.RegisterType<ILogger, loggerStub>(); IUnityContainer

我使用Ms
unity容器
rhinomock
创建存根

我尝试创建存根并将其注册到unity容器中

IUnityContainer container = ContainerManager.GetDefaultContainer;

var loggerStub = MockRepository.GenerateStub<ILogger>();

container.RegisterType<ILogger, loggerStub>();
IUnityContainer container=ContainerManager.GetDefaultContainer;
var loggerStub=MockRepository.GenerateStub();
container.RegisterType();
但是,只能注册类类型


如何注册存根(如记录器存根)以进行单元测试?

您还可以使用配置Unity容器将给定类型解析为指定实例

因此,在注册码中,您需要将最后一行更改为:

container.RegisterInstance(typeof(ILogger)、loggerStub);
然而,我发现在unis测试中需要使用IoC容器有点奇怪

您应该能够手动创建受测系统的实例

根据我的经验,我在以下情况下的测试中使用过IoC:

  • 当我需要测试容器配置本身时(例如:查看是否可以成功解析特定类型)
  • 当我有如此多的依赖项时,手动指定它们并不容易(在这种情况下,问题实际上是糟糕的设计或糟糕的测试隔离)
  • 当我需要执行集成测试(不是单元测试)时
更新 我看到了您的评论,我立即想到了两个不在单元测试中使用注入的原因:

  • 你得做比必要的更多的工作。在应用程序中,您设置了一个容器,它解决了所有问题。在测试的情况下,您需要使用不同的存根/模拟设置许多容器配置(取决于您在每个单元测试中测试的内容)。我认为手动向测试中的类提供任何依赖关系更容易
  • 在某些测试中,您可能会忘记为所有依赖项设置存根,并且您的单元测试最终可能会访问外部资源(例如数据库、远程服务)

您还可以使用配置Unity容器将给定类型解析为指定实例

因此,在注册码中,您需要将最后一行更改为:

container.RegisterInstance(typeof(ILogger)、loggerStub);
然而,我发现在unis测试中需要使用IoC容器有点奇怪

您应该能够手动创建受测系统的实例

根据我的经验,我在以下情况下的测试中使用过IoC:

  • 当我需要测试容器配置本身时(例如:查看是否可以成功解析特定类型)
  • 当我有如此多的依赖项时,手动指定它们并不容易(在这种情况下,问题实际上是糟糕的设计或糟糕的测试隔离)
  • 当我需要执行集成测试(不是单元测试)时
更新 我看到了您的评论,我立即想到了两个不在单元测试中使用注入的原因:

  • 你得做比必要的更多的工作。在应用程序中,您设置了一个容器,它解决了所有问题。在测试的情况下,您需要使用不同的存根/模拟设置许多容器配置(取决于您在每个单元测试中测试的内容)。我认为手动向测试中的类提供任何依赖关系更容易
  • 在某些测试中,您可能会忘记为所有依赖项设置存根,并且您的单元测试最终可能会访问外部资源(例如数据库、远程服务)

单元测试不应依赖于IOC容器。IOC容器(生产中)将为组件注入所需的依赖项。在测试时,您应该创建组件并(通过模拟框架)将模拟/存根实例交给它们。所以我想使用容器来处理模拟/存根实例。否?您能否给出一个您想要测试的代码示例,以及它需要什么依赖项,以及它是如何获得这些依赖项的?您的单元测试不应该依赖于您的IOC容器。IOC容器(生产中)将为组件注入所需的依赖项。在测试时,您应该创建组件并(通过模拟框架)将模拟/存根实例交给它们。所以我想使用容器来处理模拟/存根实例。否?你能给出一个你想测试的代码的例子,它需要什么依赖关系,以及它是如何得到这些依赖关系的吗?在单元测试中使用Unity没有错。这可能是因为:-(a)如果您正在使用属性注入,您希望确认DI设置正确。(b) 您正在使用拦截。我的测试中的类将注入容器中的所有内容。因此,我想使用容器来处理模拟/存根实例。否?@EladBenda在测试中,您应该手动为被测试的类提供依赖项。在这种情况下,容器将是一个额外的间接层次,没有额外的好处。这非常接近我列表中的第一个项目。在单元测试中使用Unity没有什么错。这可能是因为:-(a)如果您正在使用属性注入,您希望确认DI设置正确。(b) 您正在使用拦截。我的测试中的类将注入容器中的所有内容。因此,我想使用容器来处理模拟/存根实例。否?@EladBenda在测试中,您应该手动为被测试的类提供依赖项。在这种情况下,容器将是一个额外的间接层次,没有额外的好处。这很接近我名单上的第一颗子弹。