温莎城堡:单元测试组件生命周期
我想编写一个非回归测试来验证瞬态组件是否已经发布。 有些是通过直接注入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