我正在開發自己的簡單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