1

我想编写一个非回归测试来验证瞬态组件是否已很好地释放。有些是通过 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,尽管如果我在调试模式下查看容器,我可以看到我的组件被很好地跟踪。这是为什么?你对这样的测试有什么建议吗?

谢谢你的帮助

4

2 回答 2

1

未跟踪您的组件的原因是该组件及其依赖项没有退役要求。在这种情况下,温莎没有理由追踪他们。

通常在使用 Windsor 时,您应该只在容器上解析一次以获取顶级组件。所有其他组件都由工厂注入或创建。无需担心注入组件的存活时间。容器将为您处理它。

对于您使用工厂创建的瞬态组件,您应该知道它们永远不会比工厂自身存在(被跟踪)更长的时间。因此,如果您不介意您的组件与您的工厂一样长,则无需释放它们(在工厂上使用销毁方法)。

对于我想确保发布它们的组件,我通常会创建单元测试,并为它在工厂中存根。这样就很容易测试调用了destroy。

我认为通过您采用的方法,您不仅可以测试代码,还可以测试容器。恕我直言,windsor 已经过很好的测试,测试应该集中在你自己的代码上。

祝你好运,马尔维恩。

于 2013-05-22T18:15:19.677 回答
0

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

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);
    }
}
于 2016-04-28T20:14:46.387 回答