我正在开发自己的简单IoC库,这是我想让线程安全的一个库。使用单元测试进行线程安全测试
我典型的单元测试是这样的:
[TestMethod]
public void TestContainerUseExistingObjectFromLifetimeManagerWithFactoryMethod()
{
// Arrange
var container = new FsContainer();
container
.For<IRepository>()
.Use(ctx => new Repository("sql_connection_string"), new ContainerControlledLifetimeManager());
// Act
var first = container.Resolve<IRepository>();
var second = container.Resolve<IRepository>();
// Arrange
Assert.AreEqual(first.ConnectionString, "sql_connection_string");
Assert.AreEqual(second.ConnectionString, "sql_connection_string");
Assert.AreSame(first, second);
}
这个伟大的工程之前,我想测试下一个方式:
[TestMethod]
public async Task TestMultiThreadContainerUseExistingObjectFromLifetimeManagerWithFactoryMethodAsync()
{
// Arrange
var container = new FsContainer();
container
.For<IRepository>()
.Use(ctx => new Repository("sql_connection_string"), new ContainerControlledLifetimeManager());
// Act
var instances = await Task.WhenAll(
Task.Run(() => container.Resolve<IRepository>()),
Task.Run(() => container.Resolve<IRepository>())
);
var first = instances[0];
var second = instances[1];
// Arrange
Assert.AreEqual(first.ConnectionString, "sql_connection_string");
Assert.AreEqual(second.ConnectionString, "sql_connection_string");
Assert.AreSame(first, second);
}
这个测试告诉我,说我有问题与Assert.AreSame
(我的第一个&第二个实例不一样)。
我已经在Resolve方法中实现了lock
语句,并且一切都开始正常工作。
问:是不是复制的大部分功能在single
正确的方式来测试线程safity multi-thread
方式?是否有意义?
我不知道你在使用什么容器,但对我来说,它是非常有意义的,它为不同的线程创建不同的管理对象实例。你确定这不是预期的行为? – yorodm
在这种情况下,我使用'ContainerControlledLifetimeManager'与单例模式相关(类似于UnityContainer')。 – FSou1