代码之家  ›  专栏  ›  技术社区  ›  Phil Sandler

如何在MBUnit中集中初始化IOC容器?

  •  0
  • Phil Sandler  · 技术社区  · 15 年前

    我们目前有一套通过MBUnit测试套件运行的集成测试。我们正在重构大部分代码以使用ioc框架(structuremap)。

    我想在MBUnit测试运行程序启动时配置/初始化容器一次,使用我们在生产中使用的相同注册表代码。

    在MBUnit中有实现这一点的方法吗?

    (编辑)MBUnit版本为2.4.197。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Phil Sandler    15 年前

    找到它了。assemblycleanup属性。

    http://www.testingreflections.com/node/view/639

        2
  •  0
  •   KevM    15 年前

    我理解您只想为整个测试运行启动一个容器,并让它成为整个测试套件执行过程中使用的容器。这个 MBUnit docs 让它看起来您可能能够使用testsuitefexture和testsuitefexturesetup来完成您想要的工作。

    我想从一个结构图用户和测试驱动开发人员的角度来谈谈。

    我们很少在测试套件中使用容器,除非我们明确地测试从容器中拉出东西。必要时,我使用下面的抽象测试基类(警告我们使用nunit):

    [测试夹具] 带容器的公共抽象类 { 受保护的IContainer容器;

    [TestFixtureSetUp]
    public void beforeAll()
    {
        Container = new ServiceBootstraper().GetContainer();
        Container.AssertConfigurationIsValid();
    } 
    

    } 公共类引导程序 { 公共引导程序() { objectfactory.initialize(x=> { //在此处注册资料 (}); }

    public IContainer GetContainer()
    {
        return ObjectFactory.Container;
    }}
    

    对于普通测试,我建议您跳过普通容器,只使用结构映射中包含的自动锁定容器。这是我们使用的另一个方便的抽象测试基类。

     public abstract class Context<T> where T : class
    {
        [SetUp]
        public void Setup()
        {
            _services = new RhinoAutoMocker<T>(MockMode.AAA);
    
            OverrideMocks();
    
            _cut = _services.ClassUnderTest;
    
            Given();
        }
    
        public RhinoAutoMocker<T> _services { get; private set; }
        public T _cut { get; private set; }
    
        public SERVICE MockFor<SERVICE>() where SERVICE : class
        {
            return _services.Get<SERVICE>();
        }
    
        public SERVICE Override<SERVICE>(SERVICE with) where SERVICE : class
        {
            _services.Inject(with);
    
            return with;
        }
    
        public virtual void Given()
        {
        }
    
        public virtual void OverrideMocks()
        {
        }
    }
    

    下面是一个使用上下文测试仪的基本测试:

        [TestFixture]
    public class communication_publisher : Context<CommunicationPublisher>
    {
        [Test]
        public void should_send_published_message_to_endpoint_retrieved_from_the_factory()
        {
            var message = ObjectMother.ValidOutgoingCommunicationMessage();
    
            _cut.Publish(message);
    
            MockFor<IEndpoint>().AssertWasCalled(a => a.Send(message));
        }
    }
    

    对不起,如果这不是你想要的。只是这些技术对我们很有效,我想和大家分享一下。