温莎城堡:单元测试组件生命周期

我想编写一个非回归测试来验证瞬态组件是否已经发布。 有些是通过直接注入ctor,其他类型的工厂创建的。 我认为我可以这样做:

// Given
var rootComponent = container.Resolve<IRootComponent>();
var c1 = rootComponent.C1;
var c2 = c1.C2;
etc.

Assert.True(Container.Kernel.ReleasePolicy.HasTrack(c1));
Assert.True(Container.Kernel.ReleasePolicy.HasTrack(c2));

// When
c1.Close();

// Then
Assert.False(Container.Kernel.ReleasePolicy.HasTrack(c1));
Assert.False(Container.Kernel.ReleasePolicy.HasTrack(c2));

HasTrack()总是返回false ,尽管如果我以调试模式查看容器,我可以很好地跟踪我的组件。 这是为什么? 你有这样的测试建议吗?

Thx为您提供帮助


你的组件没有被跟踪的原因是组件和它的依赖关系没有降级要求。 在这种情况下,Windsor没有理由跟踪它们。

在使用windsor时,一般只能在容器上解决一次,以获得最高级别的组件。 所有其他组件都是由工厂注入或创建的。 无需担心注入组件的实时时间。 容器将为您处理。

对于用工厂创建的暂时性组件,您应该意识到它们永远不会活(被追踪)的时间长于工厂本身。 所以如果你不介意你的组件在你的工厂生活,就不需要释放它们(在工厂使用销毁方法)。

对于我希望确保释放它们的组件,我通常会创建单元测试,并将其存储到工厂中。 这样就很容易测试销毁。

我认为你采用的方法不仅仅是测试你的代码,而且还是容器。 恕我直言windsor已经很好的测试,测试应该专注于你自己的代码。

祝你好运,Marwijn。


两年太晚了,但这是一个测试。

public class DependsOnSomethingDisposable
{
    private readonly SomethingDisposable _disposable;

    public Boolean SomethingDisposableIsDisposed { get { return _disposable.Disposed; } }
    public DependsOnSomethingDisposable(SomethingDisposable disposable)
    {
        _disposable = disposable;
    }
}

public class SomethingDisposable : IDisposable
{
    public Boolean Disposed { get; private set; }
    public void Dispose()
    {
        Disposed = true;
    }
}

[TestClass]
public class WindsorLifestyleTests
{
    private IWindsorContainer _container;

    [TestInitialize]
    public void Setup()
    {
        _container = new WindsorContainer();
    }

    [TestCleanup]
    public void Cleanup()
    {
        _container.Dispose();
    }

    [TestMethod]
    public void TransientDependencyIsDisposed()
    {
        _container.Register(
            Component.For<DependsOnSomethingDisposable>().LifestyleTransient(),
            Component.For<SomethingDisposable>().LifestyleTransient()
            );
        var resolved = _container.Resolve<DependsOnSomethingDisposable>();
        _container.Release(resolved);
        Assert.IsTrue(resolved.SomethingDisposableIsDisposed);
    }

    [TestMethod]
    public void NonTransientDependencyIsNotDisposed()
    {
        _container.Register(
            Component.For<DependsOnSomethingDisposable>().LifestyleTransient(),
            Component.For<SomethingDisposable>().LifestyleSingleton()
            );
        var resolved = _container.Resolve<DependsOnSomethingDisposable>();
        _container.Release(resolved);
        Assert.IsFalse(resolved.SomethingDisposableIsDisposed);
    }
}
链接地址: http://www.djcxy.com/p/59869.html

上一篇: Castle Windsor: unit test component lifecycle

下一篇: Castle Windsor assembly versioning and MSTest