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

0

2 年遅すぎますが、ここでテストを行います。

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 に答える