【发布时间】:2016-05-15 04:13:12
【问题描述】:
当我运行我的 xUnit 单元测试时,我有时会在一个或多个测试中收到一条错误消息,例如“事务(进程 ID 58)在锁定资源上与另一个进程死锁,并已被选为死锁受害者”,似乎随机。如果我自己重新运行任何失败的测试,它就会通过。
我应该怎么做才能防止这种情况发生?是否可以选择一个接一个地运行测试而不是一次运行所有测试?
(注意,我正在 Visual Studio 2015 下的 ASP.Net 5 MVC 控制器中通过 API 方法运行测试)
这是我偶尔失败的测试之一的示例:
[Fact]
private void TestREAD()
{
Linq2SQLTestHelpers.SQLCommands.AddCollections(TestCollections.Select(collection => Convert.Collection2DB(collection)).ToList(), TestSettings.LocalConnectionString);
foreach (var testCollection in TestCollections)
{
var testCollectionFromDB = CollectionsController.Get(testCollection.Id);
Assert.Equal(testCollection.Description, testCollectionFromDB.Description);
Assert.Equal(testCollection.Id, testCollectionFromDB.Id);
Assert.Equal(testCollection.IsPublic, testCollectionFromDB.IsPublic);
Assert.Equal(testCollection.LayoutSettings, testCollectionFromDB.LayoutSettings);
Assert.Equal(testCollection.Name, testCollectionFromDB.Name);
Assert.Equal(testCollection.UserId, testCollectionFromDB.UserId);
}
}
测试调用有两个方法,这里是控制器方法:
[HttpGet("{id}")]
public Collection Get(Guid id)
{
var sql = @"SELECT * FROM Collections WHERE id = @id";
using (var connection = new SqlConnection(ConnectionString))
{
var collection = connection.Query<Collection>(sql, new { id = id }).First();
return collection;
}
}
这是辅助方法:
public static void AddCollections(List<Collection> collections, string connectionString)
{
using (var db = new DataClassesDataContext(connectionString))
{
db.Collections.InsertAllOnSubmit(collections);
db.SubmitChanges();
}
}
(请注意,我在控制器方法中使用 Dapper 作为微 ORM,因此,为了避免在测试中可能出现重复错误,我在测试中使用 LINQ to SQL 来设置和清理 -测试数据。)
单元测试类的构造函数和Dispose方法中也有数据库调用。如果需要,我可以将它们添加到帖子中。
【问题讨论】:
-
您可能想分享您正在编写的测试类型 - 对您的
async/Task管理等的一些见解。现在您可以做任何事情,显然有些人正在取得成功,我们只需要弄清楚您的上下文中泄漏/锁定的内容...... -
完成了,够了吗?
-
嗯 - 看起来并不能归咎于那里的 xUnit。您是否正在破坏连接 [及其相关的锁]?
-
我会添加控制器方法,我不这么认为。
标签: linq-to-sql dapper xunit.net